Ответов: 4 Просмотров: 989
|
Есть скрипт который берет информацию с базы данных через хранимые процедуры
формирует csv файл, и загружает результат по фтп обратно на сайт.
Работало все нормально, однако в последнее время началось, затыкание работы скрипта,
встает колом на 19 строке, думал что может проблема в сотруднике , однако убирал сотрудника из базы и тогда скрипт вставал на следующем, обратил внимание что если я выводил доп информацию о работе скрипта на экран, (типо echo $workerCount." - ".$workerFirstName." (".$workerID.")) тогда скрипт вставал на 17 или 15 строке.
ps. работа хранимых процедур проверял на сервере базы данных - отрабатывает без ошибок.
вот сам скрипт:
<?php
require_once "functions.php";
require_once "csvBuilder.php";
//ini_set('display_errors',1); // отображать ошибки
//error_reporting(E_ALL); // отображать ошибки
set_time_limit(0);
//echo ini_get("memory_limit")."\n"; // показать лимит какой есть
ini_set("memory_limit", "256M");
//echo ini_get("memory_limit")."\n"; // показать лимит какой установлен
set_error_handler('err_handler');
function err_handler($errno, $errmsg, $filename, $linenum) {
$date = date('Y-m-d H:i:s (T)');
$f = fopen('errors.txt', 'a');
if (!empty($f)) {
$filename =str_replace($_SERVER['DOCUMENT_ROOT'],'',$filename);
$err = "$errmsg = $filename = $linenum\r\n";
fwrite($f, $err);
fclose($f);
}
}
$time_start = getmicrotime();
define("SITE_PATH", $_SERVER["DOCUMENT_ROOT"]);
class UserExport {
protected $medicalWorkers = array();
protected $data = array();
protected $csvFileName = "";
private $FTP_SERVER = "ftp";
private $FTP_SERVER_PORT = 21;
private $FTP_USER_NAME = "user";
private $FTP_USER_PASS = "passw";
private $FTP_UPDATE_PATH = "";
public function init(){
// шаг 1. Забираем список врачей с сайта
$url = '---';
$stringData = file_get_contents($url);
$this->medicalWorkers = unserialize($stringData);
$this->csvFileName = SITE_PATH."/csv/export.csv";
__("step 0 stop");
return $this;
}
protected function filterSchedule($result, $workerID){
$data = array();
while($line = mssql_fetch_array($result, MYSQL_ASSOC)){
if($line["Subj_ID"] != $workerID){
continue;
}
$data[] = array(
$line["Subj_ID"],
$line["computed2"],
$line["duration"],
$line["busy"]
);
}
return $data;
}
public function prepareData(){
// mssql
$link = mssql_connect("saite", "user", "passw") or die("Could not connect : " . mssql_error());
mssql_select_db("site_cashe") or die("Could not select database"); //
// Monday Wednesday Saturday работает нормально,
// ошибка работы Thursday, Firday, Sunday
$dateStart = date("Y.m.d");
$dateStop = date("Y.m.d", strtotime("now+7 day"));
__("step 1 stop");
$zapos = " select Subj_ID, coalesce(SUBJECT_schedule,''), coalesce(specialty_schedule,''), convert(varchar(19),date_begin,120), duration, busy, place from site_cashe.dbo.mss_view_md_schedule";
// шаг 2. забираем для каждого доктора информацию о его расписании
$data = array();
__(count($this->medicalWorkers));
$workerCount = 0;
foreach($this->medicalWorkers as $workerID=>$workerFirstName){
$query = "exec site_cashe.dbo.mss_proc_md_sched ule @date_start='".GetA( 'start_date', $dateStart )."', @date_end='".GetA( 'end_date', $dateStop )."', @subj='".$workerFirstName."%', @spec='%', @busy_look=".GetA( 'busy', 1 ).$zapos;
$result = mssql_query($query) or die("Query failed : " . mssql_get_last_message());
__($workerCount." = ".$query);
//шаг 3. отсеиваем не нужную информацию, и складываем в общую копилку
$data = array_merge( $data,
$this->filterSchedule($result, $workerID)
);
__($workerCount." - ".$workerFirstName." (".$workerID.") период ".$dateStart ." - ".$dateStop);
$workerCount++;
if($workerCount > 100){
__("Break {$workerCount} !");
break;
}
/* Освобождаем память от результата */
mssql_free_result($result);
}
/* Закрываем соединение */
mssql_close($link);
__("step 3 stop");
$this->data = $data;
return $this;
}
public function createCSV(){
$data = $this->data;
// Шаг 4. формируем результаты в виде csv
$fields = array(
array(
"Caption"=>"Код врача",
"Name"=>"0"
),
array(
"Caption"=>"Начало приема",
"Name"=>"1"
),
array(
"Caption"=>"Длительность",
"Name"=>"2"
),
array(
"Caption"=>"Занято",
"Name"=>"3"
)
);
$builder = new CsvBuilder;
$builder->create($data, $fields);
$result = $builder->buildToFile( $this->csvFileName );
__("step 4 stop");
return $this;
}
public function uploadToFTP(){
if(!file_exists($this->csvFileName)){
throw new Exception("Нет файла для экспорта ".$this->csvFileName);
}
// Шаг 5. Передаем сформированный csv файл по фтп на сервер сайта
$ftp_connect = @ftp_connect($this->FTP_SERVER, $this->FTP_SERVER_PORT);
$login_result = @ftp_login($ftp_connect, $this->FTP_USER_NAME, $this->FTP_USER_PASS);
if((!$ftp_connect) || (!$login_result)) {
throw new Exception("Невозможно установить FTP подключение к серверу <b>".
$this->FTP_SERVER."</b> для пользователя <b>".$this->FTP_USER_NAME."</b>");
}
// загрузить файлы
$pathToUpload = $this->FTP_UPDATE_PATH.".../Upload/schedule.csv";
ftp_pasv($ftp_connect, true);
if(!ftp_put($ftp_connect, $pathToUpload, $this->csvFileName, FTP_BINARY) ) {
throw new Exception("Не удалось залить залить файл ".$this->csvFileName." на FTP ".$pathToUpload);
}
ftp_close($ftp_connect);
__("step 5");
return $this;
}
// Шаг 6. дергаем на выполнение скрипт по загрузке данных
public function startToImport(){
$url = '...updateSchedule=1';
$stringData = file_get_contents($url);
__("step 6");
}
}
$export = new UserExport();
try{
__("Start!");
$export->init()
->prepareData()
->createCSV()
->uploadToFTP()
->startToImport();
__("Done!");
}
catch(Exception $e){
__("Error: ".$e->getMessage());
}
?>
(Добавление)
единственная ошибка которая в лог кидается
date() [<a href='function.date'>function.date</a>]: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Krasnoyarsk' for '7.0/no DST' instead = C:\Program Files\Apache Group\Apache2\htdocs\export.php = 85
но на сервере такой же TZ указан, кстати, да и эта ошибка вылетает когда скрипт отрабатывает без залипа. |