为什么此代码无法在新文件中工作?
问题描述:
我写了/发现了一个php脚本,我不明白它为什么有一次工作,而另一次没有。该脚本连接到游戏服务器,并试图从它那里得到信息:为什么此代码无法在新文件中工作?
$ip = 'MyServer';
$port = 'OurPort';
$connect_ip = "udp://" . $ip;
$connect = fsockopen($connect_ip, $port, $errno, $errstr, 30);
socket_set_timeout ($connect, 1, 000000);
$send = "ÿÿÿÿ" . chr (0x02) . "getstatus";
fputs($connect, $send);
fwrite ($connect, $send);
$output = fread($connect, 1);
if(!empty($output)) {
do {
$status_pre = socket_get_status($connect);
$output = $output . fread($connect, 1);
$status_post = socket_get_status($connect);
} while ($status_pre['unread_bytes'] != $status_post['unread_bytes']);
};
$output = explode ('\\', $output);
var_dump($output);
输出工作,是这样的:
array(149) { [0]=> string(20) "ÿÿÿÿstatusResponse " [1]=> ........ }
我想:让我们做正确,它包装成一个功能像这样(所有代码保持不变,除了开始和结束行)。这将仍然工作,只要它停留在同一个文件中。但我想我可以把功能“检查”到一个新的文件,然后我得到这个结果:
**status.php**
function check($ip, $port) {
$connect_ip = "udp://" . $ip;
$connect = fsockopen($connect_ip, $port, $errno, $errstr, 30);
socket_set_timeout ($connect, 1, 000000);
$send = "ÿÿÿÿ" . chr (0x02) . "getstatus";
fputs($connect, $send);
fwrite ($connect, $send);
$output = fread($connect, 1);
if(!empty($output)) {
do {
$status_pre = socket_get_status($connect);
$output = $output . fread($connect, 1);
$status_post = socket_get_status($connect);
} while ($status_pre['unread_bytes'] != $status_post['unread_bytes']);
};
$output = explode ('\\', $output);
var_dump($output);
}
**index.php**
include('status.php');
check('MyServer', 'OurPort')
但猜猜是什么?输出是现在:
array(1) { [0]=> string(30) "ÿÿÿÿdisconnectÿÿÿÿdisconnect" }
这怎么可能?我在这里监督什么?这是奇怪的y的编码问题吗?
答
你使用fwrite然后fputs是fwrite的别名,所以你调用fwrite两次。使用它一次,你不会得到两倍的输出。
请确保以正确的编码保存文件。试试utf-8。
答
那些奇怪Ÿ与变音符号的非ASCII字符:
$send = "ÿÿÿÿ" . chr (0x02) . "getstatus";
所以,如果你编辑你必须要小心,这些都与正确的编码写的这样的文件。所以如果原始文件是用iso-8859-1
写的,那么你必须确保你的status.php
也是用iso-8859-1
写的,而不是,例如utf-8
。
更好的解决方案是用chr
编码该“前缀”,就像您使用chr(0x02)
一样。这样你就可以确保你的编辑器不会混杂起来。
你说得对,当我调用函数时通过'ÿÿÿÿ'作为参数,然后再次运行:check('ÿÿÿÿ',$ ip,$ port)。但我仍然不明白为什么。有没有对此的解释?它必须是某种编码问题...... – andreas
发现我认为的问题,所以我已经更新了我的答案。 – SnatchFrigate
fputs不是问题,但thx!我重读了那个......问题是关于编码。但我认为这个问题已经解决,因为它肯定是一个编码问题。 – andreas