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

无终端Cpanel主机下永久/每秒运行PHP脚本的轻量方案咨询

解决cPanel主机下PHP脚本每秒执行/持续运行的方案

针对你无终端cPanel主机的情况,以下是几个简单可行的方案,兼顾低资源消耗:

方案1:无限循环脚本 + Cron兜底监控

这是最靠谱的方案,既实现持续运行,又能避免进程意外挂掉。

步骤:

  1. 编写主运行脚本(比如worker.php):
    核心是用无限循环,每次执行完业务逻辑后sleep 1秒,同时处理PHP的超时限制:

    <?php
    // 忽略客户端断开连接
    ignore_user_abort(true);
    // 取消脚本执行时间限制
    set_time_limit(0);
    
    // 业务逻辑函数
    function runTask() {
        // 这里放你的请求、校验、存数据库代码
        // 注意:外部请求一定要设超时,比如curl的CURLOPT_TIMEOUT=5,避免卡住
        // 数据库操作尽量用批量或高效查询,减少耗时
    }
    
    // 持续循环执行
    while (true) {
        runTask();
        // 每秒执行一次,这里sleep 1秒
        sleep(1);
        // 可选:释放内存,避免内存泄漏
        gc_collect_cycles();
    }
    ?>
    
  2. 编写监控脚本(比如monitor.php):
    用来检查主脚本进程是否存活,没存活就启动它,然后用Cron每分钟执行一次这个监控脚本:

    <?php
    $pidFile = '/home/你的用户名/public_html/worker.pid';
    $workerPath = '/home/你的用户名/public_html/worker.php';
    
    // 检查进程是否存在
    if (file_exists($pidFile)) {
        $pid = file_get_contents($pidFile);
        // 用posix扩展检查进程(如果主机支持)
        if (function_exists('posix_getpgid') && posix_getpgid($pid)) {
            exit; // 进程还在,直接退出
        }
        // 不支持posix的话,用exec命令检查
        exec("ps aux | grep $pid | grep -v grep", $output);
        if (!empty($output)) {
            exit;
        }
    }
    
    // 启动主脚本,后台运行
    $pid = exec("php $workerPath > /dev/null 2>&1 & echo $!");
    file_put_contents($pidFile, $pid);
    ?>
    
  3. 设置Cron任务:
    在cPanel的Cron Jobs里,添加每分钟执行的任务:

    * * * * * php /home/你的用户名/public_html/monitor.php
    

注意事项:

  • 一定要优化你的业务代码,确保每次runTask()执行时间远小于1秒,避免循环堆积
  • 定期检查内存占用,如果有内存泄漏,要在循环里手动释放资源
  • 部分主机商禁止后台长期运行进程,建议先测试,或者联系主机商确认

方案2:第三方定时任务服务触发(简单但依赖外部)

如果不想搞后台进程,可以用第三方定时任务工具,设置每秒请求你的PHP脚本URL(比如https://你的域名/worker.php)。

注意事项:

  • 你的脚本必须是无状态、快速执行的,每次请求处理完立即退出,避免并发请求堆积
  • 要在脚本里加防重复执行的逻辑,比如用数据库锁:执行前检查是否有正在运行的任务,有就直接退出
  • 注意服务器的请求频率限制,每秒一次的请求如果太多,可能被主机商判定为攻击

方案3:长连接网页循环(不推荐,风险高)

可以写一个网页脚本,打开后持续循环执行,但这个很容易被主机商的连接超时限制干掉,而且只能在浏览器打开时运行,适合临时测试:

<?php
ignore_user_abort(true);
set_time_limit(0);
ob_start();

while (true) {
    // 执行业务逻辑
    runTask();
    // 输出内容避免连接超时
    echo ' ';
    ob_flush();
    flush();
    sleep(1);
}
?>

关键优化点(所有方案通用):

  • 外部请求必须设置短超时(比如3-5秒),避免脚本卡住
  • 数据库操作尽量用预处理语句,减少连接开销
  • 避免在循环里做 heavy 操作,比如大文件读写、复杂计算,尽量轻量化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:52:39