我在这里遇到困难,我正在尝试调试。
我有一个剪贴板脚本,它有一个文件锁定以防止多个实例,并且在非cli执行时也有一个块。
我已经将它设置为cron以便每分钟运行一次。剪贴板执行一些数据库功能,并将状态输出到2个文本文件,我使用jquery页面进行监控,所以我看到了现实。
所以我可以看到脚本是空闲还是正在运行,我可以看到最后工作的字符串和详细信息。我还在数据库中检查以查看待处理的否。刮板应该处理的网站。
现在的情况是,我看到待定的号码。网站减少,但检查说脚本是空闲的,并没有任何东西输入2文本文件。
当我尝试ps aux | grep php
时,我看到了2行。
root 3159 0.0 0.0 4392 664 ? Ss 17:57 0:00 /bin/sh -c php /var/www/html/workers/scraper.php
root 3160 0.0 1.5 298100 15824 ? S 17:57 0:00 php /var/www/html/workers/scraper.php
当我尝试自己运行它时,使用php scraper.php它运行(它不应该,因为文件锁现在应该失败),我得到它。
root 3159 0.0 0.0 4392 664 ? Ss 17:57 0:00 /bin/sh -c php /var/www/html/workers/scraper.php
root 3160 0.0 1.5 298100 15824 ? S 17:57 0:00 php /var/www/html/workers/scraper.php
root 3295 0.0 1.4 297852 15208 pts/2 S+ 18:11 0:00 php scraper.php
无论如何想法发生了什么?我一直在努力寻找什么错误。简而言之,cron实际上完成了工作并进行了报废,但它并不关心文件锁定或将状态输出到文本文件,这看起来很奇怪。
以下是代码:
<?php
error_reporting(E_ALL);
if(PHP_SAPI !== 'cli' || isset($_SERVER['HTTP_USER_AGENT'])) {
exit('cli only');
}
//get the site lists.
require_once("writedata.php");
require_once("dbconnect.php");
//set file lock to get script status
$file = fopen("lock.txt","w+");
// exclusive lock
if (flock($file, LOCK_EX | LOCK_NB))
{
// Grab lock. Continue work.
echo "Started Running";
//ALL THE MAIN WORK HAPPENS HERE.
$sql = "SELECT site FROM `sites` WHERE status=0 LIMIT 2500";
$result = $db->query($sql);
while($row = $result->fetch_assoc()){
$site=$row['site'];
file_put_contents("errors.txt", $site);
//Scrapper functions and parsing functions removed.
}
}
else{
echo "Script already running";
exit;
}