You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在XAMPP中实现单个PHP计划任务并发运行多进程?

问题描述

在Windows 10的XAMPP(PHP 7.4.3)环境中,通过任务计划程序运行cron.php脚本调用process_1.php和process_2.php时,第二个进程必须等待第一个进程完成后才会启动。需要实现多进程并发运行,避免为每个进程单独创建计划任务(若有100个进程则需创建100个任务,操作繁琐)。

已测试的方法均为顺序执行:

  • 使用include引入两个脚本
  • 使用exec调用php.exe执行两个脚本
  • 使用cURL依次请求两个脚本

浏览器中打开两个窗口可实现独立并发运行,期望通过单个计划任务达成同样效果以节省时间(例如单进程耗时1小时,顺序执行需2小时,并发仅需约65分钟)。已知Thread、Parallel、curl_multi_exec可能为可行方案,需具体实现指导。


解决方案

1. 利用exec启动Windows后台进程

Windows环境下,exec默认会等待命令执行完成,结合start /B命令可让子进程后台运行,主PHP进程无需等待即可启动下一个任务:

<?php
// cron.php
// 需替换为你的php.exe和脚本的绝对路径
exec('start /B "" "C:\xampp\php\php.exe" -f "C:\xampp\htdocs\process_1.php"');
exec('start /B "" "C:\xampp\php\php.exe" -f "C:\xampp\htdocs\process_2.php"');
?>
  • start /B表示后台运行,空引号""是start命令的窗口标题参数(必须保留,否则路径含空格时会出错)
  • 务必使用绝对路径,避免任务计划程序因环境变量缺失找不到文件

2. 使用curl_multi_exec实现并发HTTP请求

若脚本可通过HTTP访问(如浏览器可直接打开),可通过curl_multi_exec同时发起多个请求,模拟浏览器多窗口并发的行为:

<?php
// cron.php
$urls = [
    'http://localhost/process_1.php',
    'http://localhost/process_2.php'
];

$mh = curl_multi_init();
$handles = [];

// 创建curl句柄并添加到多句柄组
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $handles[] = $ch;
    curl_multi_add_handle($mh, $ch);
}

// 执行并发请求
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

// 清理资源
foreach ($handles as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);
?>
  • 需确保Apache服务处于运行状态,脚本可通过localhost正常访问

3. 使用PHP多线程扩展(需安装对应扩展)

若要在PHP进程内实现线程级并发,可使用Parallel扩展(兼容PHP 7.4):

  1. 先通过PECL下载并安装适配PHP 7.4的Parallel扩展
  2. 编写如下代码:
<?php
// cron.php
use Parallel\Runtime;

$runtime1 = new Runtime();
$runtime2 = new Runtime();

// 启动并行任务
$task1 = $runtime1->run(function(){
    require 'process_1.php';
});
$task2 = $runtime2->run(function(){
    require 'process_2.php';
});

// 可选:若无需等待任务结果,可省略以下两行
$task1->value();
$task2->value();
?>
  • 此方式为真正的线程级并发,无需依赖HTTP服务,但需确保扩展安装配置正确

注意事项
  • 任务计划程序的执行用户需拥有访问XAMPP目录和PHP程序的权限
  • 若脚本涉及文件读写,需处理并发锁问题,避免数据冲突
  • 对于大量进程(如100个),使用exec + start /B时需注意系统资源占用,避免同时启动过多进程导致卡顿

内容的提问来源于stack exchange,提问作者trashycat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 19:15:40