首页 > 解决方案 > 当脚本运行超过 30 分钟时,数据库中的 PHP 脚本更新记录

问题描述

我有一个 PHP 脚本,它每晚运行以更新我的数据库中的记录。在我的数据库中,我也有这个脚本的记录:

文件名

脚本1.php

完全的

ñ

脚本完成后,我对数据库进行最后一次更新,这是更新“script1.php”并将其更改为“Y”

如果我删除了文件中除了最后一次调用数据库之外的所有内容,那么脚本会将“N”更改为“Y”就可以了。

问题是,在标记为完成之前,我正在获取记录并将它们插入到我的数据库中,总共需要 38 分钟。

这可能是我的问题,38 分钟后脚本完成,但它不会将“N”更新为“Y”。

代码

upload_max_filesize = 256M
post_max_size = 256M
max_input_vars = 10000
memory_limit = 512M
max_execution_time = 3000

这些是服务器上的配置设置,我无法更改这些设置,因为这些已经是我允许的最大设置。

虽然我得到一个 504 网关超时,但记录继续插入到数据库中。所有记录都被完美地插入,但是这个“N”并没有变成“Y”。

如何让脚本运行足够长的时间以将此 'N' 更新为 'Y' ?

按要求编码

<?php
// Run Script
require_once('removed');

ignore_user_abort(true); // just to be safe

echo('Script Started.');

flush();
// Do processing here

error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once('removed');
require('removed');
require('remvoed');

$filename = basename(__FILE__);
checkcrondependencies($filename);


//REMOVED DATA SUPPLIER CLASS

  date_default_timezone_set("Europe/London");


    $domainpath = realpath(dirname(__FILE__));
    $inipath = REMOVED;
    $privatepath = REMOVED;

    $connection_settings = REMOVED;
    $dbhost = $connection_settings['dbhost'];
    $dbname = $connection_settings['dbname'];
    $dbuser = $connection_settings['dbuser'];
    $dbpass = $connection_settings['dbpass'];

    //Make connection to supplier 


   $iscronfile = 'Y';

  $conn = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
  if (!$conn) {
      new_log_entry($filename,'DB Connection Failed','Y',$iscronfile);
      die("Connection failed: " . mysqli_connect_error());
  }

    // pull data from supplier 
    //push data to DB
    // Total time 38 minutes

     echo "completed";
     setcroncompleted($filename); // <<< THIS IS SUPPOSED TO CHANGE 'N' TO A 'Y'
     new_log_entry($filename,'Run Time End:'.date("Y-m-d h:i:sa"),'N',$iscronfile);

标签: phpmysqlapache

解决方案


脚本通过cron运行?制作一些限制器来限制脚本执行。您可以让 cron 每分钟触发一个小时,但在 $script_is_busy == true 和 update_is_done = false 的地方记录。在限制器达到限制后,确保 $script_is_busy = false 并记录更新的距离。一分钟后,下一次 cron 迭代将继续更新。更新完成后记录 $update_is_done = true;。如果 cron 像 unpdate_is_dome == true 那样触发“empty scipt”,这没什么大不了的?死()。


推荐阅读