我正在尝试设置一个cron作业来更新我们所有的客户端。它们在我们的web根目录中都有自己的db和目录。单个调用使用以下脚本:
<?php
include_once 'BASEPATH'.$_REQUEST['client'].'PATHTOPHPLIB';
//Call some functions here
//backup db
$filename='db_backup_'.date('G_a_m_d_y').'.sql';
$result=exec('mysqldump '.Config::read('db.basename').' --password='.Config::read('db.password').' --user='.Config::read('db.user').' --single-transaction >BACKUPDIRECTORYHERE'.$filename,$output);
if($output=='') {
/* no output is good */
}else {
logit('Could not backup db');
logit($output);
}
?>
我需要多次调用相同的脚本,每次都有一个基于传入的客户端变量的唯一包含。我们最初为每个客户端都有一个独特的cron作业,但这不再是可能的。调用这个脚本的最佳方式是什么?我正在考虑创建一个新的php脚本,它将有我们的客户端数组并循环运行此脚本,但我不能只是包含它,因为库将有重叠的函数。我不考虑cUrl,因为这些脚本不在web根目录
首先,为Symfony控制台组件做一个快速广告。还有其他的,但我已经使用Symfony有一段时间了,并且被它所吸引。希望你是PSR-0/作曲家能够在你的项目。即使你不是,这也可以给你一个借口去做一些独立的事情。
你绝对不希望这些脚本在浏览器下。让它们在apache中运行是没有价值的,并且在内存和运行时方面对它们施加了限制,这在命令行php上下文中是不同的。
基础脚本:
<?php
if (PHP_SAPI != "cli") {
echo "Error: This should only be run from the command line environment!";
exit;
}
// Script name is always passed, so $argc with 1 arg == 2
if ($argc !== 2) {
echo "Usage: $argv[0] {client}'n";
exit;
}
// Setup your constants?
DEFINE('BASEPATH', '....');
DEFINE('PATHTOPHPLIB', '...');
require_once 'BASEPATH' . $argv[1] . 'PATHTOPHPLIB';
//Call some functions here
//backup db
$filename='db_backup_'.date('G_a_m_d_y').'.sql';
$result=exec('mysqldump '.Config::read('db.basename').' -- password='.Config::read('db.password').' --user='.Config::read('db.user').' --single-transaction >BACKUPDIRECTORYHERE'.$filename,$output);
if($output=='') {
/* no output is good */
} else {
logit('Could not backup db');
logit($output);
}
调用脚本运行在cron:
<?php
// Bootstrap your master DB
// Query the list of clients
DEFINE('BASE_SCRIPT', 'fullpath_to_base_script_here');
foreach ($clients as $client) {
exec('/path/to/php ' . BASE_SCRIPT . " $client");
}
如果您想在调用者脚本中保持解耦,您可以将路径传递给备份处理脚本,而不是将其硬连接,如果是这样,使用相同的技术从$argc和$argv中获取参数。