【发布时间】:2013-08-07 22:46:50
【问题描述】:
好的,所以我运行了一个不错的 php 服务器,它使用我编写的这个小函数打开了一个 AF_UNIX 套接字。像这样被调用
$IPC_connector = socket_create_IPC('/tmp/connection');
function socket_create_IPC($FILE)
{
#Create a AF_UNIX socket
if(!($socket = socket_create(AF_UNIX, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Couldn't create socket: [$errorcode] $errormsg \n");
}
#Bind
if( !socket_bind($socket, $FILE) )
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Could not bind socket : [$errorcode] $errormsg \n");
}
if(socket_listen($socket) === false)
{
die("socket_listen() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n");
}
socket_set_nonblock($socket);
return $socket;
}
然后我写了一个这样连接到这个服务器的客户端
if(!($IPC = socket_create(AF_UNIX, SOCK_STREAM, 0)))
{
$errorcode = socket_last_error();
$errormsg = socket_strerror($errorcode);
die("Error:Couldn't create socket - [$errorcode] $errormsg \n");
}
echo "socket_create(): ".socket_strerror(socket_last_error($IPC))."\n";
if(!(socket_connect($IPC, '/tmp/connection')))
echo "socket_connect() failed, reason: ".socket_strerror(socket_last_error($IPC))."\n";
客户端实际上是从一个网页的 AJAX 请求中调用的,它应该连接到服务器,获取一些数据,然后将该数据返回给网页。 ajax 请求是用 javascript 发出的。 我已经在没有 AJAX 请求的情况下测试了客户端/服务器连接并且它可以工作,但是一旦我通过网页尝试使用 AJAX 连接,客户端就会返回“socket_connect() failed, reason: Permission denied”来自脚本中的 echo 语句。也许我缺少一些小疏忽?我假设 Ajax 是通过 httpd (apache) 调用的。我确定这可能是某种类型的文件权限问题,但我无法弄清楚究竟是什么原因造成的。
到目前为止我尝试过的事情,
确保 php.ini 中的 safe_mode 已关闭, 尝试“setsebool -P httpd_can_network_connect on”来阻止 SElinux, 还尝试了“setenforce 0”,这也没有什么区别。 我尝试将 /tmp 和所有子目录的文件权限更改为 777 无济于事。 我的想法不多了,我想也许有人以前见过这个问题, 我还查看了这个,这是我的服务器正在创建的文件 ->
[root@ip-000-000-000-000 tmp]# ls -lZa connection
srwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 connection
如果有人对 AJAX 调用感兴趣,我会使用这个
function communication (IP, MechanismID, CommandName) {
$.post('php/connectDisconnect.php', {
IP : IP,
MechanismID : MechanismID,
CommandName : CommandName
},
function(data) {
if(data.search("Error") != -1)
alert(data);
});
}
其中 connectDisconnect.php 是上面的客户端。
【问题讨论】:
-
暂时没有时间看完整的Q,但首先想到的是同源限制。 (如果我离开了,我稍后会删除它。)
-
@TecBrat --我查看了“同源政策”,但我不太确定它是否适用于此,我可能非常错误,但似乎该政策是为了获取数据从网络上的其他地方。我的问题是连接在同一台服务器上运行的两个 php 脚本? -- 输入这个让我得到了答案,所以我非常感谢你。
-
就像我说的那样,我之前很匆忙,并没有阅读整个问题,但我很高兴它给你带来了一个很好的答案。
标签: php ajax sockets ipc selinux