如何在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):
- 先通过PECL下载并安装适配PHP 7.4的
Parallel扩展 - 编写如下代码:
<?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
相关产品推荐
相关产品推荐

