好的,所以我运行了一个很好的php服务器,用我写的这个小函数打开了一个AF_UNIX socet。这样被称为
$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()失败,原因:许可被拒绝"来自脚本中的echo语句。也许我失踪了一些小小的疏忽?我假设Ajax是通过httpd(apache)调用的。我确定它可能是某种类型的文件权限,但我无法确定究竟是什么导致它。
到目前为止我尝试过的事情,
确保在php.ini中关闭了safe_mode, 尝试" setsebool -P httpd_can_network_connect on"试图挫败SElinux, 也尝试了#se;; 0" 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是上面的客户端。
答案 0 :(得分:0)
事实证明,ajax调用是以apache用户身份运行的,而从我的服务器为socket创建的文件是root用户所拥有的。我通过将这几行代码添加到我调用socket_create()的服务器来解决这个问题。
#Deletes the old pipe in case the server crashed last time it closed and didn't use socket_close()
$command = "rm -f /tmp/connection";
exec($command);
#Creates the data pipe for the webpage to connect to
$IPC_connector = socket_create_IPC('/tmp/connection');
#Makes it to where the webpage can actually talk to the server
$command = "chown apache:apache /tmp/connection";
exec($command);
对我来说这是一个很好的工作,我想这不是正确的方法。如果有人有更好的建议或更好的做法,你会建议我想听听。