IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Принудительный обрыв связи со стороны сервера (https://www.imho.ws/showthread.php?t=104656)

Face 09.06.2006 11:27

Принудительный обрыв связи
 
Можно ли как-нибудь (командой на PHP или JS) сделать так, чтобы при выполнении скрипта сервер прекращал работу с браузером (чтобы соединение не "висело"), а скрипт еще продолжал работать (например продолжал обработку mysql-таблицы)?

Псих 09.06.2006 13:20

Вопрос немного не понятен.
Ну делаешь ты например mysql_query()... потому сделай mysql_close(db), закинь результат в массив и работай...
или я не про то дувмаю?
Сервер закроет коннект с бд. а скрипт будет выполнятся далее

Naked 09.06.2006 14:08

Цитата:

Face:
скрипт еще продолжал работать
можно в скрипте, который исполняется на вебе сделать вызов другого скрипта командой system() только вызывать скрипт другой и перед ним поставить @, т.е. system ("@script.pl"), тогда скрипт script.pl запустится в бэкграунде, и при прекращении выполнения вебовского скрипта он не должен прекратиться... :)

Face 09.06.2006 14:21

Псих, я это хочу сделать чтобы после выполнения скрипта запускалась какая-нибудь фоновая задача (секунд на 20). Так приходится делать, потому что cronа нету на сервере.

Naked, такой вариант не подходит, т.к. на сервере отключены функции: dl, shell_exec, exec, system, passthru, popen, proc_open, proc_nice, proc_get_status, proc_close, proc_terminate, posix_mkfifo :(

Naked 09.06.2006 14:34

Цитата:

Face:
Так приходится делать, потому что cronа нету на сервере
думаю нужно либо менять сервер, либо увеличивать таймаут выполнения скрипта, в фоне вроде нельзя запустить не используя командную строку... Опиши полностью проблему, потому что, если тебе нужно, чтобы пользователю вывелась нормальная страничка а в паралели выполнился скрипт, то скрипт можно выполнять в нулевом фрейме или что-то типа того...

Face 09.06.2006 14:39

Naked, сервер поменять никак не получится... Просто я хочу сделать замену cronа... Чтобы после открытия любой страницы сайта, если подошло время запуска определенного скрипта, он запускался, но т.к. он не выводит никакого текста клиенту, мне нужно чтобы связь разорвалась, а скрипт продолжал работу.

aoxyz_30330 09.06.2006 21:15

Цитата:

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

вообше же можно просто делать вложениэ своего скрипта (который есессна делает что надо в зависемости от определенного интервала или условия но ничего не выводит) в каждую запускаeмую страницу ...

Face 09.06.2006 21:42

Цитата:

aoxyz_30330:
register_shutdown_function() - ето php. таким образом зарегеная функция никакого вывода в stdout делать не будет и не должна, и будет запускацца при завершении скрипта
не должна, но делает... к примеру скрипт:
PHP код:

<?
function sleep1() {
    sleep(10);
    echo 'sleep';
}
register_shutdown_function('sleep1');
echo 'test ';
exit();
?>

браузер при запросе этого скрипта ждет 10 секунд, а потом выводит "test sleep" :(

Цитата:

aoxyz_30330:
вообше же можно просто делать вложениэ своего скрипта (который есессна делает что надо в зависемости от определенного интервала или условия но ничего не выводит) в каждую запускаeмую страницу ...
Я так и буду делать, но мне нужно, чтобы вложенный скрипт выполнялся уже при разорванном соединении с браузером...

aoxyz_30330 10.06.2006 02:12

ага ... все, понял, извени ...

вообше ето странно, т.к. в доках пишут

Цитата:

Зарегистрированные register_shutdown_function() функции будут вызваны после того, как запрос выполнен окончательно (включая отсылку любых буферов вывода), соответственно вы не сможете из этих функций вывести что-либо в броузер, используя echo() или print(), или возвратить содержимое какого-либо буфера вывода, используя ob_get_contents().
нада подумать ...

мда, тока ета, я не понимаю зачем тебе там чтото выводить ... если всеравно выводить ничего ненадо ... мда ... тем более если у тебя все функции на ету тему отключены ...

ето ... нехочу разочаровывать, но ... если функции типа exec, system и т.д. не разрешены, то ето значит, что из скрипта ты не можеш породить нового процесса, который бы продосжал существовать после завершения работы етого скрипта ... а ето в свою очередь значит, что так как ты хочеш не получится - ибо все что бы ты не предпринимал из скрипта, будет работать в рамках одного процесса и умрет естественно с ним вместе (в данном случае при разрыве соединения). единственный выход - ето ставить задачи так, чтобы они работали в моменты наименьшей загрузки сервака, гдето ночю например... обрати внимание - даже заход поискового бота сможет привести к выполнению задач ... например поставь задачу каждый день после 24 ... то есть первый заход после 24 запускает задачу ... и не забывай про ignore_user_abort() на всякий пожар...

Face 10.06.2006 06:15

Всем спасибо. Проблему запуска второго скрипта решил так:
PHP код:

$sock = @fsockopen($server80$errno$errstr1);
if (
$sock) {
    
stream_set_timeout($sock1);
    
$out "GET /?mod=test&id1=4444&id2=4447 HTTP/1.1\r\n";
    
$out .= "Host: $server\r\n";
    
$out .= "Connection: Close\r\n\r\n";
    
fwrite($sock$out);



aoxyz_30330 11.06.2006 02:18

мда .. ну в общем ето принципиально не то что ты хотел, но канает ... наверное, хотя надежности не 100% ... ибо сеть ...

Hubbitus 12.06.2006 10:22

А ignore-user-abort разве не для этого придумывался?

aoxyz_30330 14.06.2006 01:00

ненаю для чего ignore_user_abort придумывался ... но просто если ты чтото запрашиваеш по сети (как в твоем примере по сокету), то если сеть не доступна в етот момент, то сам понимаеш ... а усер_аборт заставляет просто выполнятся локальный скрипт до конца, несмотря на разрыв связи ... кстати, ты всетаки лучше по методу пост запрашивай, так оно немного безопаснее - ибо если ктонить найдет твой крон и начнет его выполнять направо и налево, то хорошего мало (а в данном варианте ето прямо из адресной строки брayсера мона .;) )...

Hubbitus 15.06.2006 16:24

Цитата:

aoxyz_30330:
а усер_аборт заставляет просто выполнятся локальный скрипт до конца, несмотря на разрыв связи
Дак именно это и надо было вроде, насколько я понял:
Цитата:

Face:
Я так и буду делать, но мне нужно, чтобы вложенный скрипт выполнялся уже при разорванном соединении с браузером...


Часовой пояс GMT +4, время: 02:40.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.