自动化PHP脚本
作为数据导入的一部分,我创建了一个运行在web服务器/本地主机上的PHP文件,以便将数据从CSV源文件输入到数据库中。问题是这个页面需要手动打开,所以本质上就像在后面运行实际的MySQL脚本一样。自动化PHP脚本
如何添加此文件在服务器上每天的特定日期运行,而无需“人员”交互。
我尝试了一些其他的解决方案,如:在任务程序器 开始PHP,然后用参数 -fÇ运行它:\ Apache24 \ htdocs中\ my_phpfile.php
然而,这似乎没有执行PHP文件是因为在查看表中的信息时没有更新。我知道PHP文件可以工作,因为我通过浏览器手动运行了这个文件。
请问我能得到一些建议/帮助吗?做这个的最好方式是什么?
我目前正在测试Windows 10笔记本电脑上的环境,但最终会在Windows 2012 Server上运行。
谢谢。
您可以运行任务计划程序中的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,了解Task-Scheduler运行实例失败的原因。
如果您无法在CLI模式下运行该脚本并且必须在Web模式下运行该脚本,则可以使用wget
,curl
或类似命令甚至使用Internet Explorer的命令行选项来使用该脚本。
或使用http://SetCronJob.com或类似的服务。
这里有很多选项 - 我脑海中的“最好”是最简单的(KISS principe):直接在CLI中运行PHP。出现问题的可能性更小,您不是仅仅为了加载PHP而引导Apache(这是一个巨大的浪费),您不依赖于网络连接,您不依赖于第三方(付费)网络服务,而是没有更新IE的风险! WTS也是可靠的(无论在Windows Server上)。
感谢你们......你推荐哪种方法最多,称之为“稳定”解决方案,因为缺乏更好的术语?我已经设法让它运行一个* .bat文件,然后它返回了预期的结果。 –
查看更新的答案。是包装在一个.bat是常见的做法。它有助于封装命令行以实现可移植性,例如可以将第一张CD放入正确的位置。然后你只需要拨打蝙蝠,在WTS中没有参数(我发现它的界面很容易找到路径和参数!)。 – scipilot
我的.bat文件运行良好。我现在添加了一个邮件功能,为了验证目的,必须稍微修改一下PHPMailer。但是我又一次遇到了同样的问题。 如果我使用Web界面,即邮件,邮件只会被发送。但是在运行bat文件时不发送邮件。但是,数据已更新。 –
您可能想尝试使用schtasks
实用程序创建任务,以使用cmd或powershell创建Windows cron作业(https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx)。下面是一个例子,它将创建名称为task_name的任务,每5分钟运行一次:
schtasks /Create /TN task_name /SC /MO 5 c:\php\php.exe d:\path\to\php_script.php
这是'at'的替代品吗? – scipilot
@scipilot我想'schtasks'被设计为'at'的替代品 - 它具有更多改进的语法和功能,包括灵活的任务调度。 –
* .bat文件有窍门。并通过任务计划程序将其踢出。最初我有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 <[email protected]>, Name2<[email protected]>' . "\r\n";
$headers .= 'From: Report Server <[email protected]>' . "\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 = "[email protected]";
$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 = '[email protected]';
$mail->FromName = 'Reports Server';
$mail->AddAddress('[email protected]', 'Name1');
$mail->AddAddress('[email protected]', 'Name2');
$mail->AddAddress('[email protected]', '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);
?>
FreeBSD/Linux用户在这里。对Windows没有想法,我也不知道你的PHP是如何编码的,但是如果你可以从命令行运行PHP,你的方法是正确的。或者,如果您可以使用'curl','wget'或'fetch'命令从命令行“调用”网页,则可以调度该命令。 – Tigger
在unix系统中,你可以做cronjobs,也许你可以在Windows?用AT命令 –