从另一个内部生成PHP脚本。非阻塞

时间:2013-08-09 17:33:34

标签: php multithreading

我有一个PHP脚本,我需要在另一个PHP网页内执行。然而,对于第二个正常运行,第一个需要完全完成。基本上我需要第一页为第二个脚本生成一个新的进程/线程,它将在启动前等待1秒。

执行include会导致阻止阻止它工作,我无法让它开始使用exec

编辑:

应该澄清一下。这些页面没有输出,也没有通过Web界面连接。所有页面都由来自其他服务器的POST请求调用。


编辑2:

解决方案:让服务器请求页面在第一次返回后1秒钟直接向第二页发送请求。

3 个答案:

答案 0 :(得分:1)

一个选项是在第一个脚本完成后重定向页面。

你可以这样做:

//first script here
sleep(1); //wait one second
echo "<meta http-equiv=\"refresh\" content=\"0;URL='yoursecondscript.php'\" />"; //redirect

甚至:

//first script here
//redirect after one sec 
echo "<meta http-equiv=\"refresh\" content=\"1;URL='http://thetudors.example.com/'\" />";

答案 1 :(得分:1)

正如@ChristopherMorrissey指出的那样,proc_open是正确的选择。我想在这里详细说明一下,因为使用proc_open有一些注意事项并不完全明显。

在第一个代码示例@ http://php.net/manual/en/function.proc-open.php中,它显示了整体用法,我将引用它。

第一个警告是管道。管道是PHP中的文件流,链接到子进程的STDIN,STDOUT和STDERR。在该示例中,管道索引0表示来自父PHP进程透视图的文件流。如果父进程写入此流,它将显示为子进程的STDIN输入。

在符合POSIX的操作系统上,进程的STDIN需要在进程终止之前关闭。从父级调用管道上的fclose非常重要,否则您的子进程将被卡住。这是通过示例中的这一行完成的:

fclose($pipes[0]);

另一个警告是检查子进程的退出代码。检查退出代码是确定子进程是否已正确退出或错误退出的最佳方法。至少,您需要知道子进程何时完成。选中此选项和退出代码均使用http://www.php.net/manual/en/function.proc-get-status.php

完成

如果要确保进程正确退出,则需要查看proc_get_status中数组中返回的exitcode字段。请记住,此退出代码仅返回一次有效值。所有其他时间它将返回-1。所以,有一次它返回&gt; -1,这是您的实际退出代码。因此,第一次running == false时,请检查exitcode

我希望这会有所帮助。

答案 2 :(得分:0)

您可以在需要时将标题写入第二页,然后将标题放回第二页末尾的原始页面。虽然有很多原因导致此修复无效,例如需要在HTML中使用PHP代码。

Headers reference 类似于:header(Location: seconddocument.php)

或许您可以将PHP放在函数中执行,然后从原始PHP文档中调用它。我不能完全确定你的要求,但那些将是我最好的答案。