自动化 PHP 脚本

3
作为数据导入的一部分,我创建了一个PHP文件,可以在Web服务器/本地主机上运行,从CSV源文件将数据输入到数据库中。问题在于,这个页面需要手动打开,因此本质上就像在其后面运行实际的MySQL脚本。
如何将此文件添加到服务器上特定日期的每一天运行,而不需要“人类”干预呢?
我尝试了其他解决方案,例如:在任务计划程序中启动PHP,然后使用参数-f C:\Apache24\htdocs\my_phpfile.php运行它。但是,当查看表中的信息时,似乎没有执行PHP文件。我知道PHP文件可以正常运行,因为我已经通过浏览器手动运行过它。
请问我可以得到一些建议和帮助吗?最佳方法是什么?
我目前正在我的Windows 10笔记本电脑上测试环境,但最终将在Windows 2012 Server上运行。
谢谢。

1
我是FreeBSD/Linux用户,对于Windows一窍不通。我也不清楚你的PHP代码是如何编写的,但如果你能够从命令行运行PHP,那么你的方法是正确的。或者,如果你可以使用类似于curlwgetfetch这样的工具从命令行“调用”一个网页,那么你也可以安排该命令来实现相应功能。 - Tigger
在Unix系统中,你可以使用cronjobs,也许你也可以在Windows中使用AT命令? - Nico
3个回答

2
您可以在任务计划程序中运行 PHP 脚本(我经常这样做),但请注意以下几点:

您需要以 php C:\Apache24\htdocs\my_phpfile.php 的形式运行它。

PHP 必须在您的 PATH 中,否则您将需要直接指定路径:

c:\php\php C:\Apache24\htdocs\my_phpfile.php

这是在CLI模式下运行,而不是Web模式。当你在Apache中运行脚本时,环境与CLI有很大的不同。由于环境的差异,你的脚本可能无法按照你的预期运行。 例如:
  • 当前目录不同,
  • 没有$_SERVER变量,
  • $_ENV将不同,
  • 没有.htaccess文件,
  • 用户将不同,因此文件访问权限也会不同。
  • 加载的模块可能不同,
  • 甚至PHP.ini文件也可能不同。
要在CLI中测试它,只需打开PowerShell或CMD提示符,并输入与WTS中输入的相同的命令行。你可能会看到一些输出,告诉你问题所在。
查看php_errors.log以查看任务计划程序运行实例失败的原因。
如果你无法在CLI模式下使脚本工作,并且必须在Web模式下运行它,你可以使用wget、curl或类似的工具来访问Web脚本,甚至可以使用Internet Explorer的命令行选项。
或者使用http://SetCronJob.com或类似的服务。
这里有很多选择 - 在我看来最好的选择是最简单的(KISS原则):直接在CLI中运行PHP。这样可以减少出错的可能性,不需要启动Apache只为了加载PHP(非常浪费),不依赖网络连接,不依赖第三方(付费)Web服务,也不会受到IE更新的影响!WTS在Windows Server上也是可靠的。

谢谢这个……你会推荐哪种方法作为最稳定的解决方案呢?我已经成功地运行了一个*.bat文件,然后它返回了预期的结果。 - Leon Claassen
查看更新的答案。将命令包装在 .bat 文件中是常见的做法。这有助于封装命令行以实现可移植性,并且可以首先切换到正确的位置,例如使用 CD 命令。然后,只需在 WTS 中调用 bat 文件,而无需输入任何参数(我发现它的界面对路径和参数不够灵活!)。 - scipilot
我的.bat文件运行得非常好。我现在添加了一个邮件功能,并为身份验证目的稍微修改了PHPMailer。但是,我再次遇到了最初的相同问题。只有在使用Web界面(即Chrome)时才会发送邮件,但是在运行bat文件时不会发送邮件。但是,数据已经更新。 - Leon Claassen

2

这是 at 的替代品吗? - scipilot
@scipilot 我认为 schtasks 是作为 at 的替代品而设计的,它具有更改进的语法和功能,包括灵活的任务计划。 - Aleksey Ratnikov

1

*.bat文件解决了问题,并通过任务计划程序启动。最初,我将批处理文件指向错误的目录,这就是为什么某些功能无法正常工作的原因。我的下一步是清理我的代码,并使用base64和html美化邮件。

php C:\Apache_Directory\htdocs\my_phpscript.php

我的脚本...是的,我知道它不是很干净/完美,还有很多工作要做,但现在它正在做我需要它做的事情:

 <?php

$sql1 = "USE database_name";

$sql2 = "TRUNCATE TABLE my_table";

$sql3 = "LOAD DATA LOCAL INFILE 'DataImport//import_file.csv' 
REPLACE INTO TABLE my_table
CHARACTER SET latin1
FIELDS TERMINATED BY ','
IGNORE 1 LINES
(`record_number`
, `module_name`
, `action_date`
, `location`
, `type_of_outlet`
, `user_name`
, `store_code`
, `outlet_name`
, `line_question`
, `line_field_id`
, `line_value`
, `brand_code`
, `brand`);";

/* $sql4 = "SELECT COUNT(creation_time) FROM my_table
WHERE DATE(creation_time) = DATE_SUB(CURRENT_DATE(), INTERVAL 0 DAY)"; */


$con=mysqli_connect("localhost","root","mysqlpassword","database");

if (mysqli_connect_errno()) {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
};

$result1 = mysqli_query($con, $sql1);
$result2 = mysqli_query($con, $sql2);
$result3 = mysqli_query($con, $sql3);

if (mysqli_affected_rows($con) > 1) {
  $message ="". mysqli_affected_rows($con). " rows were successfully added to the my_table table!";
} else {
  $message = "" . mysqli_error($con). "has caused the update to fail";
};

echo $message;

 // To send HTML mail, the Content-type header must be set
require("PHPMailerAutoload.php"); // path to the PHPMailerAutoload.php file.
require("class.phpmailer.php"); 
$headers  = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";

// Additional headers
$headers .= 'To: Name1 <name1@domain.co.za>, Name2<name2@domain.co.za>' . "\r\n";
$headers .= 'From: Report Server <ReportServer@domain.co.za>' . "\r\n";
$subject = 'Data Import Resultt' ."\r\n";

   $mail = new PHPMailer();
   $mail->IsSMTP(true);
   $mail->Mailer = "smtp";
   $mail->Host = "smtp.host.co.za";
   $mail->Port = 587;                       // 8025, 587 and 25 can also be used. Use Port 465 for SSL.
   $mail->SMTPAuth = true;
   $mail->SMTPSecure = 'tls';
   $mail->Username = "username@domain.co.za";
   $mail->Password = "password";
   $mail->CharSet = "UTF-8";
   $mail->SMTPOptions = array(              // Bypass security verification on e-mail. WARNING: When using this method, 
    'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
    )
);


   $mail->From     = 'reportserver@domain.co.za';
   $mail->FromName = 'Reports Server';
   $mail->AddAddress('name1@domain.co.za', 'Name1');
   $mail->AddAddress('name2@domain.co.za', 'Name2');
   $mail->AddAddress('name3@domain.co.za', 'Name3');   







   $mail->Subject  = $subject;
   $mail->Body     = $message."\r\n";
   $mail->WordWrap = 50;  

   if(!$mail->Send()) {
        echo 'Message was not sent.';
        echo 'Mailer error: ' . $mail->ErrorInfo;
        exit;
   } else {
        echo 'Message has been sent.';
   }





mysqli_close($con); 

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接