如何在后台运行php函数(不是外部进程)?

时间:2011-02-10 13:03:02

标签: php background

如何在后台运行PHP函数,而不是进程?例如,我必须这样做:

(php code)
1º) retrieve data from database#1
2º) retrieve data from database#2
3º) If #1 and #2 have finished, do my calculations.

函数#1和#2也是PHP代码。我不想使用“exec”或“system”,因为它们不是外部进程,它们也是PHP代码!我想应该存在一些聪明的方法来在后台运行PHP函数或行,就是这样。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

PHP不执行多线程*,因此您无法在同一脚本中执行此操作。

您需要启动一个单独的PHP进程,该进程通过单独的脚本运行。

对于CLI和可能的CGI模式,

*)there is pcntl_fork但它有陷阱,文档和示例在这看起来很稀疏,它仅限于Unix / Linux,我假设你在一个网页无论如何它都不起作用。

答案 1 :(得分:0)

您可以设置cURL multi handler,它可以并行运行不同的脚本(并从中获取数据)。在我看来,这是在PHP中运行多线程脚本的最佳选择。

你必须改变一些东西 - 你想在后台运行的功能必须移动到他们自己的脚本中,并由cURL处理程序单独调用。

http://php.net/manual/en/function.curl-multi-exec.php

以下是一些使用示例:

http://codestips.com/php-multithreading-using-curl/

https://web.archive.org/web/20091014034235/http://www.ibuildings.co.uk/blog/archives/811-Multithreading-in-PHP-with-CURL.html

答案 2 :(得分:0)

正如其他海报所说,直接无法进行穿线。

就您的具体问题而言,有一些方法可以做到这一点。您可以使用MySQLi::multi_query()。第一个查询需要先完成,然后才能使用第二个查询的结果

$mysqli->multi_query($sql1 . ';' . $sql2);
$result1 = $mysqli->store_result();
$rows1 = $result1->fetch_all();
$result2 = $mysqli->store_result();
$rows2 = $result2->fetch_all();

两个查询并排执行。结果会同步返回,但它可以正常工作。

您还可以使用register_tick_function()模拟线程。有some docs在线to actually使用时间刻度for threading。但是我必须警告你,以这种方式试图滥用它们通常是一个非常糟糕的主意,因为它并不是真正的线程它不会表现得不好喜欢它(语句仍按顺序执行,因此阻塞语句将阻止所有内容)。

答案 3 :(得分:0)

Php确实支持线程化 (需要PECL pthreads> = 0.34)

你会在这里找到一个例子http://php.net/manual/en/thread.start.php