我有一个在我的登台机器上运行的 php 脚本,它将一个 xml 文件处理到我的数据库中,然后调用一些 MySQL 程序,这些程序用于通过一堆查询来清理数据。
我有一些程序变得越来越庞大并且需要几个小时才能运行(这就是它在分期中完成的原因)。
有没有办法让 PHP 调用这些程序而不等待结果移动到脚本的其余部分?
我有一个在我的登台机器上运行的 php 脚本,它将一个 xml 文件处理到我的数据库中,然后调用一些 MySQL 程序,这些程序用于通过一堆查询来清理数据。
我有一些程序变得越来越庞大并且需要几个小时才能运行(这就是它在分期中完成的原因)。
有没有办法让 PHP 调用这些程序而不等待结果移动到脚本的其余部分?
由于您使用的是网络界面,因此有可能。您可以尝试实现以下逻辑
告诉我你的想法。
PHP 不支持核心并发。但是您可以使用以下方法模拟类似的行为。
1. fsockopen() 和 ignore_user_abort('1')
您可以创建与另一个脚本的套接字连接,该脚本随后在后台运行。请看以下两个脚本。主脚本创建到子脚本的套接字连接并立即关闭它。子脚本运行直到所有任务完成。这是因为 ini 值“ignore_user_abort”设置为 1。
主文件
<?php
$start = microtime(true);
$host = 'localhost';
$target = '/sub.php';
$fp = fsockopen($host, 80);
$request = "GET $target HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= "Connection: Close\r\n\r\n";
fwrite($fp, $request);
fclose($fp);
file_put_contents("main", "Script runs " . (microtime(true) - $start) . " seconds");
子.php
<?php
$start = microtime(true);
ignore_user_abort("1");
sleep(5);
file_put_contents("sub", "Script runs " . (microtime(true) - $start) . " seconds");
2.在后台通过命令行启动脚本
您可以在后台通过 unix/linux 或 windows 命令行启动脚本。以下示例适用于 unix/linux 命令行。要通过 Windows 命令行启动脚本,请参阅 PHP.net 站点上的以下注释。http://www.php.net/manual/en/function.exec.php#110131
主文件
<?php
$start = microtime(true);
pclose(popen("/usr/bin/php " . __DIR__ . "/sub.php " . __DIR__ . "//sub.log 2>&1 &", 'r'));
file_put_contents("main", "Script runs " . (microtime(true) - $start) . " seconds");
子.php
<?php
$start = microtime(true);
sleep(5);
file_put_contents("sub", "Script runs " . (microtime(true) - $start) . " seconds");
以下扩展在 PHP 中提供了真正的并发性:
pthreads 是一个面向对象的 API,它允许 PHP 中的用户级多线程。它包括创建针对 Web 或控制台的多线程应用程序所需的所有工具。PHP 应用程序可以创建、读取、写入、执行以及与线程、Worker 和 Stackables 同步。