PHP脚本如何可以启动另一个PHP脚本,然后退出,让其它的脚本来运行?
此外,有没有什么办法了,当它达到一个特定的行第二个脚本通知PHP脚本?
PHP脚本如何可以启动另一个PHP脚本,然后退出,让其它的脚本来运行?
此外,有没有什么办法了,当它达到一个特定的行第二个脚本通知PHP脚本?
以下是如何做到这一点。 你告诉浏览器输出的第N个字符阅读,然后关闭连接,而你的脚本保持运行,直到它完成。
<?php
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo ('Text the user will see');
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Will not work
flush(); // Unless both are called !
// At this point, the browser has closed connection to the web server
// Do processing here
include('other_script.php');
echo('Text user will never see');
?>
您可以通过有效地达到这个分叉 ,然后调用include
或require
。
parent.php:
<?php
$pid = pcntl_fork();
if ($pid == -1) {
die("couldn't fork");
} else if ($pid) { // parent script
echo "Parent waiting at " . date("H:i:s") . "\n";
pcntl_wait($status);
echo "Parent done at " . date("H:i:s") . "\n";
} else {
// child script
echo "Sleeper started at " . date("H:i:s") . "\n";
include('sleeper.php');
echo "Sleeper done at " . date("H:i:s") . "\n";
}
?>
sleeper.php:
<?php
sleep(3);
?>
输出:
$ php parent.php Sleeper started at 01:22:02 Parent waiting at 01:22:02 Sleeper done at 01:22:05 Parent done at 01:22:05
然而,分叉本身并没有允许任何进程间通信,所以你必须找到一些其他的方式来告知孩子已经达到了特定的路线,像你的问题问父母。
下面是一个在黑暗中拍摄:你可以尝试使用PHP的OS执行功能有&
。
exec("./somescript.php &");
此外,如果不工作,你可以试试
exec("nohup ./somescript.php &");
编辑: nohup的是POSIX命令忽略HUP(挂起)信号,使命令,以保持谁发出命令退出的用户后运行。 的HUP(挂起)信号是由常规的终端警告注销,这取决于过程的方式。
将pcntl_fork()
做类似于你最终想要有所建树? http://www.php.net/manual/en/function.pcntl-fork.php
如果你不想建了pcntl扩展,然后一个很好的选择是使用proc_open()。
http://www.php.net/manual/en/function.proc-open.php
使用与stream_select在一起(),所以你的PHP程序可以睡觉,直到有事跟你创建子进程。
这将有效地在后台创建一个进程,而不会阻塞父PHP进程。 你PHP可以读取和写入到STDIN,STDOUT,STDERR。
为了使浏览器加载完成(停止加载进度指示器),那么你可以使用哪些米兰Babuškov提及。
以使浏览器的关键认为HTTP请求完成,是向它发送的内容长度。 要做到这一点,你就可以开始缓冲的要求,然后刷新它,你发送的Content-Length头之后。
例如:
<?php
ob_start();
// render the HTML page and/or process stuff
header('Content-Length: '.ob_get_length());
ob_flush();
flush();
// can do more processing
?>
您可以创建一个请求,并关闭它完成后立即被写入连接。
签中的代码http://drupal.org/project/httprl如能做到这一点(非阻塞请求)。 我打算推动这一lib添加到GitHub上,一旦我得到它更加精致; 东西可以的Drupal外面跑去。 这应该做你在找什么。