多次调用php脚本,包含唯一的include


Call php script multiple times, with unique include

我正在尝试设置一个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中获取参数。