所以基本上我有一个 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中是否可以这样做?
答案 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";