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


Spawning a PHP script from inside another. Non-blockning

我有一个PHP脚本,需要在另一个PHP网页中执行。然而,要使第二个程序正常运行,第一个程序需要完全完成。从本质上讲,我需要第一个页面为第二个脚本生成一个新的进程/线程,该脚本将等待1秒才能启动。

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

编辑:

本应澄清。这些页面没有输出,也没有通过web界面进行接口连接。所有页面都由来自另一台服务器的POST请求调用。


编辑2:

解决方案:让请求页面的服务器在第一个返回后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。因此,当它返回>-1时,这就是实际的退出代码。因此,第一次running==false时,请检查exitcode

我希望这能有所帮助。

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

你可以这样做:

//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/''" />";

您可以在需要时编写一个指向第二页的页眉,然后在第二页末尾将页眉放回原始页。尽管有很多原因导致这个修复不起作用,比如PHP代码需要在HTML中。

标头引用所以类似于:header(Location: seconddocument.php)

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