我有一个运行 Apache 2.2.3 和 PHP 5.4.8 的 CentOS 5.9 机器。
我正在尝试使用 PHP 设置服务器,以便另一台服务器上的 C 应用程序可以轻松地从我们的网络服务器查询一些信息。
我还希望能够从同一个网络服务器本地向服务器发送数据包,以方便地控制服务器。
问题是,当服务器和客户端都通过浏览器/apache访问时,客户端永远无法连接。当我通过 CLI 执行客户端或服务器时,它突然起作用了。
我在 Ubuntu 机器上测试了相同的代码,它没有任何问题。
对于测试/调试,服务器会在 30 秒后自动关闭。
澄清:
- 浏览器转到 serverstart.php
- 浏览器转到 client.php
- 结果:client.php 一直加载,直到 serverstart.php 达到 30 秒关闭,然后以拒绝连接响应
- 浏览器转到 serverstart2.php,它使用 exec、passthru 或 system('php -f serverstart.php');
- 浏览器转到 client.php
- 结果:不起作用。客户端挂起,直到 serverstart.php 在 30 秒后关闭。
- 命令行: php -f serverstart.php
- 浏览器转到 client.php
- 结果:有效
- 浏览器转到 serverstart.php
- CLI: php -f 客户端.php
- 结果:有效
- 浏览器转到 serverstart.php
- CLI:回显“测试”| 数控本地主机 8000
- 结果:有效
客户端.php
<?php
$client = stream_socket_client("tcp://localhost:8000", $errno, $errorMessage);
if ($client === false) {
echo "Failed to connect: $errorMessage";
}
fwrite($client, "This is a test" . PHP_EOL);
echo stream_get_contents($client);
fclose($client);
服务器启动.php
<?PHP
$server = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errorMessage);
if ($server === false) {
throw new UnexpectedValueException("Could not bind to socket: $errorMessage");
}
$start = microtime(true);
while((microtime(true) - $start) < 30) { // 30 second timeout
$client = @stream_socket_accept($server, 1);
if ($client) {
echo 'Client Found';
$message = fgets($client, 1024);
echo 'Client said:' . $message;
fwrite($client, 'The local time is ' . date('n/j/Y g:i a') . PHP_EOL);
fclose($client);
}
}
任何人都知道这里发生了什么以及如何让它通过浏览器调用两者?
编辑:我想补充一点,盒子上没有运行防火墙。iptables 出现空白并且 SELinux 被禁用。