并行包含PHP中的函数?

时间:2014-07-13 09:55:07

标签: php cron

所以基本上我有一个 cron.php 文件,我用它作为引导文件,而不是设置大量不同的 Cron Jobs ,我希望能够在同一时间对我所有单独的Cron文件进行包含,而不是等待第一个完成,然后是第二个... ...

这是我当前的 cron.php 文件:

/*
* run this file every minute to execute all crons
*/

$included_cron = true;

ini_set('max_execution_time', 0);
require "files/core.php";

/*===== 1st Cron! =====*/

    include ROOT.'/files/crons/file1.php';

/*===== 2nd Cron! =====*/

    include ROOT.'/files/crons/file2.php';

/*===== 3rd Cron! =====*/

    include ROOT.'/files/crons/file3.php';

我怎样才能这样做,因此我可以在file3.php的同时包含file1.php,在PHP中是否可以这样做?

3 个答案:

答案 0 :(得分:1)

问题的答案是:

<?php
class CronJob extends Threaded {

    public function __construct($file) {
        $this->file = $file;
    }

    public function run() {
        require_once("files/cron/{$this->file}");
    }

    protected $file;
}

$workers = 4;

$pool = new Pool($workers);

foreach (["file1.php", "file2.php", "file3.php"] as $file) {
    $pool->submit(
        new CronJob($file));
}

$pool->shutdown();
?>

这确实感觉非常糟糕,将每个cron作业编写为线程对象可能会更好,其中:: run包含每个cron任务的业务逻辑。

<?php

class FirstJob extends Threaded {
    public function __construct(Threaded $config) {
        $this->config = $config;
    }

    public function run() {
        /* do stuff for this cron job */
    }

    protected $config;
}

class SecondJob extends Threaded {
    public function __construct(Threaded $config) {
        $this->config = $config;
    }

    public function run() {
        /* do stuff for this cron job */
    }

    protected $config;
}

class ThirdJob extends Threaded {
    public function __construct(Threaded $config) {
        $this->config = $config;
    }

    public function run() {
        /* do stuff for this cron job */
    }

    protected $config;
}

$workers = 4;

$config = new Threaded();
$config["database"] = [
    "username" => "mine",
    "password" => "secret",
    "hostname" => "localhost",
    "database" => "data"    
];


$pool = new Pool($workers);
/* probably come up with something better, get classes from a database or configuration source or whatever */
$pool->submit(new FirstJob($config));
$pool->submit(new SecondJob($config));
$pool->submit(new ThirdJob($config));
$pool->shutdown();
?>

像这样......

答案 1 :(得分:0)

你想要的是多线程。这不是默认的(没有扩展名)php支持。你可以做的是为你的其他脚本创建http请求。

cron.php

 function http_head($url){
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_NOBODY, true);
 curl_exec($ch);
 curl_close($ch);
 }
 http_head("file1_url");
 http_head("file2_url");

如果您的cron执行敏感操作(您不希望使用Google抓取工具或随机用户触发您的cron),您应该执行某种检查,无论是否由您的cron调用(例如通过IP地址)。

在文件* .php中,你应该告诉php在调用者关闭连接后不要中止。     ignore_user_abort(真);

答案 2 :(得分:0)

如果您需要一个单一的入口点来完成所有任务,但是您需要多任务处理,则必须使用支持它的语言。 PHP没有。

最明显的选择是bash:

#!/bin/sh
php /path/to/cron.php file1 &
php /path/to/cron.php file2 &
php /path/to/cron.php file3 &
php /path/to/cron.php file4 &

现在你只需要调整cron.php来接受命令行参数:

if (isset($argv[1]) ) {
    $task = $argv[1];
}else{
    echo "Must specify task\n";
    exit(1);
}
switch($task){
    case 'file1':
    case 'file2':
    case 'file3':
    case 'file4':
        break;
    default:
        echo "Invalid task: $task\n";
        exit(2);
}

include ROOT . "/files/crons/$task.php";