Завершение вывода с продолжением выполнения

1. Михаил (17.08.2012 / 14:38)
Можно в php как-нибудь сделать так, чтобы скрипт сразу отдавал браузеру при запуске картинку, браузер считал, что загрузка завершена, но при этом продолжал выполнение?

2. Дмитрий (17.08.2012 / 14:42)
открывать на новой вкладке мб? E

3. Apeccc (17.08.2012 / 14:56)
Вывести картинку через <img src> посредством html и далее обрабатывать php код. Или не понял что-то?

4. Алексей (17.08.2012 / 14:57)
Через JS может выводить? Тизерки же вроде выводят как-то так - код из двух частей : одна в месте вывода картинки, другая в самом низу, чтобы не задерживать загрузку основного кода страницы.
Я сам в JS не очень, так что не могу пример конкретного кода привести.

5. ZipeR (17.08.2012 / 15:08)
php заканьчивает выполнения кода,а продолжаешь html так думаю

6. Михаил (17.08.2012 / 16:03)
Ужасный У (17 Августа 2012 / 14:56)
Вывести картинку через <img src> посредством html и далее обрабатывать php код. Или не понял что-то?
Что-то ты не так понял. Есть картинка, которую генерирует файл test.php. Картинку он может отдать сразу при начале выполнения, это займет тысячные секунды. А дальше нужно обработать данные пользователя, это может занять полсекунды или секунду. Для быстрой загрузки можно как-нибудь оборвать передачу данных браузеру после вывода картинки, чтобы он думал, что скрипт завершил работу, чтобы не тормозить загрузку страницы?

7. Ant0ha (17.08.2012 / 16:11)
Можно сделать так:
1. В первом скрипте сделать запрос на второй через курл с ограниченным таймаутом (можно 1 мс).
2. После этого запроса первым скриптом отдаем пользователю картинку.

8. Михаил (17.08.2012 / 16:24)
Ant0ha (17 Августа 2012 / 16:11)
Можно сделать так:
1. В первом скрипте сделать запрос на второй через курл с ограниченным таймаутом (можно 1 мс).
2. После этого запроса первым скриптом отдаем пользователю картинку.
А не получится так, что за 1мс скрипт не успеет запустить другой скрипт? И если запускать скрипт, то он локально запустится или же curl полезет за ним к тебе на сайт через интернет?

9. Ant0ha (17.08.2012 / 16:28)
Второй вопрос вообще не понял.
По поводу первого - можешь отрегулировать задержку, по идее должно работать. Таким образом у меня работают парсеры музыки и видео на сайте и всё ок. Только таймаут 1 секунда.

10. Михаил (17.08.2012 / 16:37)
Ant0ha (17 Августа 2012 / 16:28)
Второй вопрос вообще не понял.
Через curl можно запустить локальный файл, не http://site.ru/test.php , с скажем /www/mysite/public_html/test.php ?

Добавлено через 02:45 сек.
Нашел решение кое-какое http://dron.by/post/kak-zakryt-soedinenie-i-prodolzhit-vypolnenie-skripta/ буду пробовать

11. Александр (17.08.2012 / 17:23)
В http 1.1 можно так сделать, но как минимум на опере рс не работает.

12. Михаил (17.08.2012 / 17:28)
Муз-ТВ (17 Августа 2012 / 17:23)
В http 1.1 можно так сделать, но как минимум на опере рс не работает.
Опера pc это что?

13. Александр (17.08.2012 / 19:49)
12. Flyd, опера на комп.

14. Дмитрий (17.08.2012 / 19:53)
Да вы упоролись с курлом. Cнижая нагрузку на трафик, вы повышаете его на сервер. Юзайте JS.

15. Михаил (17.08.2012 / 19:57)
Нафиг js в wap?

16. Дмитрий (17.08.2012 / 20:05)
15. Flyd, ну тогда вешай свой сервер на славу, ради бога. Слушай советы с курлом D

17. Михаил (17.08.2012 / 20:09)
всё будет хорошо, не боись

18. Дмитрий (17.08.2012 / 20:09)
Ужасный У (17 Августа 2012 / 14:56)
Вывести картинку через <img src> посредством html и далее обрабатывать php код. Или не понял что-то?
он походу хидером выводит изобр

Добавлено через 00:41 сек.
dima.london (17 Августа 2012 / 20:05)
15. Flyd, ну тогда вешай свой сервер на славу, ради бога. Слушай советы с курлом D
не вешать, а ставить раком E

19. Михаил (17.08.2012 / 22:26)
ничего с ним не будет

20. Azzido (18.08.2012 / 08:14)
а зачем вообще CURL применять в этом случае?! exec('php /home/test.php'); тогда однозначно миллисекунды займет обращение к скрипту, а скрипт выполнивший команду запуска спокойно завершится

21. Петр (18.08.2012 / 08:53)
Увы, так не произойдет, первый скрипт будет "ждать" завершения второго. В Linux можно попробовать & для разделения.

22. Александр (18.08.2012 / 09:49)
А если послать header( 'Connection: close' ); ?

23. Azzido (18.08.2012 / 10:53)
21. Im-ieee, это к моему посту? Неправда это, скрипт отдаст команду через exec и продолжит выполняться, потому что это взаимодействие с подсистемой linux и процесс получит приоритет nohup

Добавлено через 00:53 сек.
shell_exec кстати, не exec, лучше использовать

24. Михаил (18.08.2012 / 11:14)
Azzido, пишу
<?php
$mt = microtime(1);
include ('include/start.php');

//echo 'Привет мир!';
exec("php /home/site/www/test.php");
echo microtime(1)- $mt;
?>

в test.php пишу

<?php
sleep(12);
?>

Скрипт выполняется 12 секунд

25. Azzido (18.08.2012 / 15:20)
тогда сделай вот так
exec("nohup php /home/site/www/test.php &");

Добавлено через 01:42 сек.
протестировал с nohup, всё работает как нужно, есть только одно, если у тебя там что то типа бесконечного цикла, то он так и повиснет в ввиде демона, и завершать придется определяя uid процесса

26. Александр (18.08.2012 / 17:04)
Проверил способ с header - работает с небольшими павками, после 8 скину код.

27. Александр (18.08.2012 / 19:43)
<?php
header('Content-Length: 0');//0 замени на размер выводимых данных
header(PHP_EOL);
flush();
file_put_contents('test.txt', 'ok');


28. Azzido (19.08.2012 / 10:33)
гм, думаю лучше всё таки использовать exec, потому что не угадаешь ведь сколько байт сгенерирует скрипт, только если включать буферизацию и получать размер буфера, но зачем такой геморрой

29. Захар (20.08.2012 / 02:48)
А вы не забыли что exec() и shell_exec() практически везде отключены? Не считаем вдс/дедики... можно попробовать что нить из серии ignore_user_abort(1); и закрывать вывод в браузер сразу после вывода картинки. Как то так

Добавлено через 05:52 сек.
Ну или если exec() то exec("php -f /path/script.php >/dev/null 2>/dev/null &"); выполнится в фоне

30. Михаил (20.08.2012 / 09:21)
C nohup вроде работает, по-крайней мере на локалке. Пасиб

Добавлено через 01:17 сек.
zaharec, vds не проблема

31. Azzido (20.08.2012 / 15:48)
30. zaharec, да ну, это ложные сведения, что везде отключены, отключают их хостеры сомневающиеся в своих знаниях и безопасности того что у них работает на сервере, потому что это можно назвать свинством, отключать такие нужные функции, хороший хостер если страдает паранойей, то делает это например запретом отключения safe mode или чем то подобным

32. Михаил (20.08.2012 / 16:49)
Кстати, а как скрипту параметры передать в случае, если использовать Exec?

33. Андрюха (20.08.2012 / 16:54)
По моему exec не принимает параметры

34. Андрюха (20.08.2012 / 17:05)
Вот попробуй

35. Azzido (20.08.2012 / 17:20)
shell_exec("nohup php -f /home/site/www/test.php &var1=str1&var2=str2 &");

содержимое test.php
<?php
echo var1;
echo '<br>';
echo var2;
?>

результат

str1
str2


36. Андрюха (20.08.2012 / 17:22)
.....

37. Azzido (20.08.2012 / 17:29)
вот так

Добавлено через 03:37 сек.
ещё можно использовать массивы argc и argv, но для этого надо разрешить их использование в htaccess, но принцип их передачи скрипту примерно тот же
shell_exec("nohup php -f /home/site/www/test.php str1 str2 &");

echo $argv[1];
echo $argv[2];

Добавлено через 04:22 сек.
в общем как то так, я что то плохо помню как точно это сделать, уточни в поисковиках

38. Azzido (20.08.2012 / 17:43)
там ошибся
<?php

echo $var1;

echo '<br>';

echo $var2;

?>
значки доллара конечно же нужны

39. Петр (20.08.2012 / 19:29)
Можно также использовать переменные окружения: putenv('PHP_VARNAME='.$var); во втором скрипте она будет в $_ENV['PHP_VARNAME']. Вариант из 36 сообщения у меня, кстати, не работает.

40. Azzido (20.08.2012 / 19:32)
40. Im-ieee, должно работать поидее, может амперсанд вконце мешает, и команда nohup

41. Александр (20.08.2012 / 20:58)
28. Azzido, если flyd отдаёт файл то придётся написать всего 1 функцию filesize не так и много.

URL: https://visavi.net/topics/33978