回答
下面介绍如何操作。您告诉浏览器读取输出的前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');
?>
你能解释一下你的代码吗?例如,冲洗诱使浏览器认为HTTP请求已结束? –
是的,它的工作原理!请同时发布这个问题的答案 - http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-into-thinking-the-http-request-is-over –
我编辑了答案来解释一点。 –
这是黑暗中的镜头:您可以尝试使用php的操作系统执行功能&
。
exec("./somescript.php &");
此外,如果不工作,你可以尝试
exec("nohup ./somescript.php &");
'nohup'?这是做什么的? –
会pcntl_fork()
做类似于你最终想要有所建树? http://www.php.net/manual/en/function.pcntl-fork.php
您可以通过forking然后调用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
然而,分叉本身并没有允许任何进程间通信,所以你你必须找到其他方式告诉父母,孩子已经到达特定线路,就像你在第四节中提到的那样问题。
+1我不认为这正是他想要的,但仍然非常有用 –
您可以通过套接字方法提供双边沟通(请参阅http://www.php.net/manual/en/ref.sockets.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之外运行的东西。这应该做你想要的。
- 1. 从另一个脚本请求一个PHP脚本,并移动
- 2. PHP脚本甚至退出()
- 3. PHP脚本退出过快
- 4. 如何让一个PHP脚本启动另一个并捕获其输出?
- 5. Bash shell脚本:我如何退出并重新启动脚本?
- 6. 是否可以在apache启动时启动一个php脚本?
- 7. bash脚本中的路径找到脚本并启动另一个脚本
- 8. 从php脚本启动一个bash脚本
- 9. 从另一个PHP脚本执行PHP脚本
- 10. 如何访问PHP脚本中的另一个PHP脚本?
- 11. 如何从另一个PHP脚本调用PHP脚本?
- 12. 从另一个PHP脚本访问受限制的PHP脚本
- 13. 如何让php脚本运行另一个php脚本
- 14. 从另一个外部php脚本运行外部php脚本
- 15. Nginx/PHP-FPM exec另一个php脚本
- 16. 从cron启动PHP脚本?
- 17. 从另一个脚本启动一个脚本不起作用
- 18. 调用另一个脚本后退出循环的Shell脚本
- 19. 从PHP脚本发出PHP GET请求并退出
- 20. Shell脚本启动,退出并运行其他脚本一旦完成
- 21. bash。从另一个执行一个脚本并退出
- 22. 为什么我的bash脚本执行另一个脚本不能退出?
- 23. PHP脚本在一定时间后触发另一个脚本
- 24. 在另一个php脚本中执行一个php脚本(带参数)
- 25. 如何从另一个php脚本中杀死一个php脚本?
- 26. 从另一个参数调用PHP脚本并获得输出
- 27. 用本地Python脚本启动本地PHP脚本
- 28. PHP脚本退出与框架
- 29. 退出PHP脚本无错误
- 30. php IPC脚本简单地退出
卷曲可以帮助吗?任何想法如何? –
卷毛?可能只是一个“头”的请求,但我很怀疑 –
- 如果第一个脚本终止,第二个脚本如何通知第一个脚本? - 这是一个网页或控制台脚本? –