[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод данных долгоиграющего скрипта
Страницы: 1, 2
BaNru
Цитата (Valick @ 11.04.2014 - 13:09)
Цитата
Работать должно не у тебя, а везде на всех конфигурациях.

Вот тут ты братец не прав, в противном случае была бы одна единственная конфигурация у всех. Если нет ни рук ни головы настроить сервер под свои нужды, то я то чем могу помочь?

Отлично! Вот мы и пришли к вопросу Воителя, ответ на который ты знаешь.
Теперь ответ в студию, что надо настроить Воителю, чтобы у него заработало?
И что надо настроить на шаред хостинге, чтобы заработало?
Игорь_Vasinsky
на локальном отработало. на хостинге - болт.

_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Воитель
Цитата (nikolaevevge @ 11.04.2014 - 12:50)
Цитата (Воитель @ 11.04.2014 - 10:34)
Есть скрипт который очень долго грузиться - пару часов. Вопрос: Есть ли где-то настройка сервера, которая позволила бы отдавать информацию пользователю до полной обработки скрипта? Может есть какая-то команда по которой отпускается информация клиенту?


P.S. Прошу не спрашивать что это за скрипт, и почему он такой долго играющий.

очень долго грузиться - пару часов

Думайте над оптимизацией работы. Не дело обрабатывать данные пару часов. Даже 15 минут это много.

У Вас там что сворачиваются бухгалтерские итоги?

Работа не с бухгалтерией но наподобие. Это скрипт не для сайта а скрипт интранет приложения.

_____________
Вечно учусь.
Воитель
Цитата (BaNru @ 11.04.2014 - 14:06)
Valick, http://test.g63.ru/other/flush.php

Показывай где у тебя работает

Согласен. Весь результат приходит в один момент.

Тут скорее всего надо копаться в настройках сервера, но ранее такого делать не приходилось.

_____________
Вечно учусь.
killer8080
Цитата (BaNru @ 11.04.2014 - 13:11)
Теперь ответ в студию, что надо настроить Воителю, чтобы у него заработало?

отключить gzip сжатие
Цитата (BaNru @ 11.04.2014 - 13:11)
И что надо настроить на шаред хостинге, чтобы заработало?

а вот тут как повезёт, если сжимает апач, то можно попробовать через .htaccess
SetEnv no-gzip dont-vary
если фронтэнд, то врядли, админы хостинга скорее всего пошлют



Спустя 4 минуты, 48 секунд killer8080 написал(а):
Воитель
вообще как уже выше говорили, такие задачи нужно запускать отдельно, в консоли, а статус проверять периодическими аякс запросами, либо читать из статус файла, который должен вести скрипт, либо настроить обработку сигналов в скрипте например USR1, и через хэндлер выдавать статус.
Воитель
Спасибо.

_____________
Вечно учусь.
sergeiss
Цитата (AllesKlar @ 11.04.2014 - 10:48)
Как один из вариантов выхода - скрипт сохраняет куда-либо промежуточные результаты. Браузер аяксом их подгружает.

Из всего, что было сказано в этой теме, процитированный ответ единственно верный для всех условий smile.gif (имха такая)

Выводить можно в БД, можно в текстовый файл (каждый раз его лучше будет открыть и закрыть). Выводишь время и какую-либо инфу, например, просто статус в текстовом виде.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Valick
Цитата
ответ единственно верный для всех условий

и достаточно не простой в реализации, не говоря уже о том что придется менять логику самого скрипта.

_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Цитата (Valick @ 14.04.2014 - 12:27)
и достаточно не простой в реализации, не говоря уже о том что придется менять логику самого скрипта.

Зачем что-то менять в логике??? В нужных местах просто делается вывод инфы в файл (или в БД) и это всё изменение логики. А уже другой скрипт (я бы так сказал, весьма простой) может читать эту инфу и предоставлять её. Это самое меньшее изо всех зол, что тут может быть.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
killer8080
Цитата (sergeiss @ 14.04.2014 - 12:13)
процитированный ответ единственно верный для всех условий

а чем плох вариант с сигналами?
sergeiss
Цитата (killer8080 @ 14.04.2014 - 14:24)
а чем плох вариант с сигналами?

Наверное, он ничем не плох... Просто я не увидел его, пока ты не задал этот вопрос. Сорри...

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
killer8080
Цитата (sergeiss @ 14.04.2014 - 17:55)
Просто я не увидел его, пока ты не задал этот вопрос.

и то верно, вот накидал пример
index.html
<!DOCTYPE html>
<html>
<head>
<title>
Background task testing</title>
<script
src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script
type="text/javascript">
var
timer;
$(function () {
$('#start').click(function(){
$('#status').html('Request send...');
$.get('ajax.php?cmd=start', function() {});
timer = setInterval(function() {
$('#response').load('ajax.php?cmd=status');
}, 1000)
});

$('#stop').click(function() {
clearInterval(timer);
$('#status').html('Stopping task...');
$('#response').load('ajax.php?cmd=stop');
});

$('#response').load('ajax.php?cmd=status');
})
</script>
</head>
<body>
<h1>
Background task testing</h1>
<div
id="status"></div>
<pre
id="response"></pre>
<input
type="button" id="start" value="Run task">
<input
type="button" id="stop" value="Stop task">
</body>
</html>

ajax.php
<?php

if(empty($_GET['cmd']))
die('Bad request');

$pipe_name = 'bgtask.php.pipe';
$pid_file = 'bgtask.php.pid';
$pid = file_exists($pid_file) ? file_get_contents($pid_file) : 0;

switch ($_GET['cmd']) {
case 'start':
start();
break;
case 'stop':
stop();
break;
case 'status':
status();
break;
default:
echo 'Bad command';
break;
}

function start() {
global $pid;

if($pid) {
echo 'Task already started';
return;
}

system('php -f bgtask.php >/dev/null 2>&1 &');
usleep(500);
echo 'Task started';
}

function stop() {
global $pid;

if(!$pid) {
echo "Task was not started, no pid file found";
return;
}

system("kill -TERM $pid");
echo 'Task was stopped';
}

function status() {
global $pid, $pipe_name;

if(!$pid) {
echo "Task not started, no pid file found";
return;
}

system("kill -USR1 $pid");
usleep(10);
system("cat $pipe_name");
}

bgtask.php
#!/usr/bin/env php
<?php

PHP_SAPI
== 'cli' or die('Error script must be run in CLI mode only');

declare(ticks=1);

function sig_handler($signal) {
global $pipe_name, $pid, $i, $start_time, $run;

$signals = array(
SIGUSR1 => 'SIGUSR1',
SIGHUP => 'SIGHUP',
SIGTERM => 'SIGTERM',
SIGINT => 'SIGINT'
);

$fh = fopen($pipe_name, 'w');

if($signal == SIGUSR1) {
$time = $start_time->diff(new DateTime());
$time = $time->format('%H:%I:%S');
fwrite($fh, "Task processing: $i iteration\nElapsed time: $time\nProcess pid: $pid");
}

if(in_array($signal, array(SIGTERM, SIGINT))) {
fwrite($fh, 'Process shutting down...');
$run = false;
}

fclose($fh);
}

pcntl_signal(SIGUSR1, 'sig_handler');
pcntl_signal(SIGHUP, 'sig_handler');
pcntl_signal(SIGTERM, 'sig_handler');
pcntl_signal(SIGINT, 'sig_handler');

$run = true;
$i = 0;
$start_time = new DateTime();

$pipe_name = 'bgtask.php.pipe';
$pid_file = 'bgtask.php.pid';
$pid = file_exists($pid_file) ? file_get_contents($pid_file) : 0;

if(!file_exists($pipe_name));
system("mkfifo $pipe_name");

if($pid) {
echo 'Task already started';
exit(1);
}

$pid = getmypid();
file_put_contents($pid_file, $pid);

// main loop
while($run) {
$i++;
echo $i;
usleep(300);
}

unlink($pid_file);
unlink($pipe_name);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.