1

我有一个在我的登台机器上运行的 php 脚本,它将一个 xml 文件处理到我的数据库中,然后调用一些 MySQL 程序,这些程序用于通过一堆查询来清理数据。

我有一些程序变得越来越庞大并且需要几个小时才能运行(这就是它在分期中完成的原因)。

有没有办法让 PHP 调用这些程序而不等待结果移动到脚本的其余部分?

4

2 回答 2

1

由于您使用的是网络界面,因此有可能。您可以尝试实现以下逻辑

  1. 每个“长 mysql 函数”一个 php 脚本
  2. 使用 AJAX 处理每个 php 脚本,因此您可以根据需要同时启动任何脚本。服务器将并行化负载。

告诉我你的想法。

于 2013-03-18T19:59:55.777 回答
1

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 同步。

http://www.php.net/manual/en/book.pthreads.php

于 2013-03-18T20:09:35.900 回答