异步请求无法使用fsock - php - Nginx

时间:2011-08-01 11:58:09

标签: nginx php-5.3 fsockopen php

我有一个PHP脚本,它执行了here所描述的接受答案。

除非我在fclose($fp)

之前添加以下内容,否则它无效
while (!feof($fp)) {
        $httpResponse .= fgets($fp, 128);
    }

即使是一个空白的for循环也可以完成工作而不是上面的工作!!

但重点是什么?我想要异步调用:(

为了增加我的痛苦,在Apache驱动的环境中没有上面的代码片段,相同的代码运行正常。

有人知道Nginx或php-fpm是否存在此类请求的问题?

1 个答案:

答案 0 :(得分:0)

您所寻找的只能在包含过程控制功能(PCNTL库)的PHP构建的Linux风格系统上完成。

你会在这里找到它的文档: http://php.net/manual/en/book.pcntl.php

具体你想做的是“分叉”一个过程。这将创建当前PHP脚本进程的相同副本,包括所有内存引用,然后允许两个脚本同时继续执行。

“父”脚本知道它仍然是主脚本。而“子”脚本(或脚本,您可以根据需要多次执行此操作)意识到这是一个孩子。这允许您在子项被分离并转变为守护程序后为父项和子项选择不同的操作。

要做到这一点,你可以使用以下内容:

$pid = pcntl_fork(); //store the process ID of the child when the script forks
if ($pid == -1) {
     die('could not fork'); // -1 return value means the process could not fork properly
} else if ($pid) {
     // a process ID will only be set in the parent script. this is the main script that can output to the user's browser
} else {
     // this is the child script executing. Any output from this script will NOT reach the user's browser
}

这将使脚本能够分离出一个子进程,该进程可以继续执行父进程输出内容并退出的一侧(或很久之后)。

您应该记住,这些功能必须编译到您的PHP版本中,并且绝大多数托管公司都不允许在其服务器上访问它们。要使用这些功能,通常需要具有虚拟专用服务器(VPS)或专用服务器。甚至云托管设置通常也不会提供这些功能,就像使用不正确(或恶意)一样,他们可以轻松地将服务器带到膝盖上。