自动化 PHP 脚本
Automate PHP Script
作为数据导入的一部分,我在网络服务器/本地主机上创建了一个 PHP 文件,该文件 运行 用于将数据从 CSV 源文件输入数据库。问题是这个页面需要手动打开,所以本质上就像 运行 在它后面实际的 MySQL 脚本一样。
如何在没有 "Human" 交互的情况下每天在服务器上的特定日期将此文件添加到 运行。
我尝试了其他一些解决方案,例如:
在 Task Schedular 中启动 PHP,然后使用参数 运行 连接它
-f C:\Apache24\htdocs\my_phpfile.php
但是,这似乎没有执行 PHP 文件,因为在查看 table 中的信息时,它没有更新。我知道 PHP 文件的工作原理与我通过浏览器手动 运行 一样。
我能得到一些建议/帮助吗?做这个的最好方式是什么?
我目前正在我的 windows 10 笔记本电脑上测试环境,但最终这将在 Windows 2012 服务器上 运行。
谢谢。
您可以 运行 php 任务计划程序中的脚本(我经常这样做)但请注意以下几点:
你运行它作为php C:\Apache24\htdocs\my_phpfile.php
PHP 必须在您的 PATH 中,否则您需要直接指向它:
c:\php\php C:\Apache24\htdocs\my_phpfile.php
运行 这样 运行 正在使用 CLI 模式,而不是 Web。当您在 Apache 中点击脚本时,环境与 CLI 大不相同。由于环境的不同,您的脚本可能不会像您预期的那样 运行ning。
例如
- 当前目录不同,
- 没有 $_SERVER 变量,
- $_ENV 会有所不同,
- 没有.htaccess,
- 用户会有所不同,因此文件访问权限也会不同
- 加载的模块可能不同
- PHP.ini甚至可能不同
要在 CLI 中对其进行测试,只需打开 PowerShell 或 CMD 提示符,然后输入与 WTS 相同的命令行。您可能会看到一些通知您问题的输出。
查看您的 php_errors.log 以了解 Task-Scheduler 运行 实例失败的原因。
如果您无法让脚本在 CLI 模式下工作并且必须 运行 它在 Web 模式下,您可以使用 wget
、curl
或类似的,甚至使用 Internet Explorer 的命令行选项。
或使用http://SetCronJob.com或类似服务。
这里有很多选择——我心目中的"best"是最简单的(KISS原理):运行直接在CLI中PHP。不会出错,你不是为了加载 PHP 而启动 Apache(巨大的浪费),你不依赖网络连接,你不依赖第 3 方(付费)网络服务,您不会面临 IE 更新的风险! WTS 也很可靠(无论如何在 Windows 服务器上)。
您可能想尝试使用 schtasks
实用程序创建任务以使用 cmd 或 powershell (https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx) 创建 Windows cron 作业。这是每 5 分钟创建一次名为 task_name 运行 的任务的示例:
schtasks /Create /TN task_name /SC /MO 5 c:\php\php.exe d:\path\to\php_script.php
*.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 <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);
?>
作为数据导入的一部分,我在网络服务器/本地主机上创建了一个 PHP 文件,该文件 运行 用于将数据从 CSV 源文件输入数据库。问题是这个页面需要手动打开,所以本质上就像 运行 在它后面实际的 MySQL 脚本一样。
如何在没有 "Human" 交互的情况下每天在服务器上的特定日期将此文件添加到 运行。
我尝试了其他一些解决方案,例如: 在 Task Schedular 中启动 PHP,然后使用参数 运行 连接它 -f C:\Apache24\htdocs\my_phpfile.php
但是,这似乎没有执行 PHP 文件,因为在查看 table 中的信息时,它没有更新。我知道 PHP 文件的工作原理与我通过浏览器手动 运行 一样。
我能得到一些建议/帮助吗?做这个的最好方式是什么?
我目前正在我的 windows 10 笔记本电脑上测试环境,但最终这将在 Windows 2012 服务器上 运行。
谢谢。
您可以 运行 php 任务计划程序中的脚本(我经常这样做)但请注意以下几点:
你运行它作为php C:\Apache24\htdocs\my_phpfile.php
PHP 必须在您的 PATH 中,否则您需要直接指向它:
c:\php\php C:\Apache24\htdocs\my_phpfile.php
运行 这样 运行 正在使用 CLI 模式,而不是 Web。当您在 Apache 中点击脚本时,环境与 CLI 大不相同。由于环境的不同,您的脚本可能不会像您预期的那样 运行ning。 例如
- 当前目录不同,
- 没有 $_SERVER 变量,
- $_ENV 会有所不同,
- 没有.htaccess,
- 用户会有所不同,因此文件访问权限也会不同
- 加载的模块可能不同
- PHP.ini甚至可能不同
要在 CLI 中对其进行测试,只需打开 PowerShell 或 CMD 提示符,然后输入与 WTS 相同的命令行。您可能会看到一些通知您问题的输出。
查看您的 php_errors.log 以了解 Task-Scheduler 运行 实例失败的原因。
如果您无法让脚本在 CLI 模式下工作并且必须 运行 它在 Web 模式下,您可以使用 wget
、curl
或类似的,甚至使用 Internet Explorer 的命令行选项。
或使用http://SetCronJob.com或类似服务。
这里有很多选择——我心目中的"best"是最简单的(KISS原理):运行直接在CLI中PHP。不会出错,你不是为了加载 PHP 而启动 Apache(巨大的浪费),你不依赖网络连接,你不依赖第 3 方(付费)网络服务,您不会面临 IE 更新的风险! WTS 也很可靠(无论如何在 Windows 服务器上)。
您可能想尝试使用 schtasks
实用程序创建任务以使用 cmd 或 powershell (https://msdn.microsoft.com/en-us/library/windows/desktop/bb736357(v=vs.85).aspx) 创建 Windows cron 作业。这是每 5 分钟创建一次名为 task_name 运行 的任务的示例:
schtasks /Create /TN task_name /SC /MO 5 c:\php\php.exe d:\path\to\php_script.php
*.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 <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);
?>