Как вызвать переадресацию до завершения php-скрипта?

Я хочу запустить php-скрипт, который отправит кучу писем (бюллетеней), но так как для этого может потребоваться некоторое время, я хочу, чтобы пользователь был немедленно перенаправлен на страницу с сообщением типа «Ваши информационные бюллетени поставлены в очередь разослал ".
Пока перенаправление заголовков работает, но они не вызывают перенаправления до тех пор, пока все письма не будут отправлены. Могу ли я закрыть соединение после отправки перенаправления, чтобы браузер сразу же перенаправил? Я пробовал такие вещи

ob_start(); ignore_user_abort(true); header( "refresh:1;url=waitforit.php?msg=Newsletters queued up, will send soon."); header("Connection: close"); header("Content-Length: " . mb_strlen($resp)); echo $resp; //@ob_end_clean(); ob_end_flush(); flush(); 

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

например, например, болван, но не повезло

 ob_start(); ignore_user_abort(true); header( "refresh:1;url=mailing_done.php?msg=Newsletters queued for sending."); header("Connection: close"); header("Content-Length: 0" ); //echo $resp; ob_end_flush(); flush(); 

Если вы хотите постоянно запускать сценарий и все еще хотите отобразить некоторый вывод, почему бы вам не использовать запрос ajax на сервер, который может отправлять почту в очередь и все равно позволить пользователю продолжить просмотр этой страницы.

Если вы не хотите использовать это; вместо этого вы можете использовать сценарий, выполняющий фоновый show_usermessage.php даже если пользователь будет перенаправлен на страницу show_usermessage.php

 <?PHP //Redirect to another file that shows that mail queued header("Location: show_usermessage.php"); //Erase the output buffer ob_end_clean(); //Tell the browser that the connection's closed header("Connection: close"); //Ignore the user's abort (which we caused with the redirect). ignore_user_abort(true); //Extend time limit to 30 minutes set_time_limit(1800); //Extend memory limit to 10MB ini_set("memory_limit","10M"); //Start output buffering again ob_start(); //Tell the browser we're serious... there's really //nothing else to receive from this page. header("Content-Length: 0"); //Send the output buffer and turn output buffering off. ob_end_flush(); flush(); //Close the session. session_write_close(); //Do some of your work, like the queue can be ran here, //....... //....... ?> 

Я бы попробовал это:

 <?php header("Location: waitforit.php?msg=Newsletters queued up, will send soon."); header("Content-Length: 0"); header("Connection: close"); flush(); //Do work here ?> 

Вот правильный способ сделать это … код Sonia Desbiens, aka: fataqui 07/01/2005

 <?php set_time_limit ( 0 ); /* start the forced redirect */ header ( 'Connection: close' ); ob_start (); /* close out the server process, release to the client */ header ( 'Content-Length: 0' ); header ( 'Location: /page_to_redirect_to.php' ); ob_end_flush (); flush (); /* end the forced redirect and continue with this script process */ ignore_user_abort ( true ); /* the rest of your script here */ /* * this example will redirect the user to '/page_to_redirect_to.php' * then this script will continue by sleeping for '10' seconds, then * this script will write a file, and then this script will exit... */ sleep ( 10 ); file_put_contents ( './out.txt', '' ); exit (); ?> 

Попробуйте установить Content-Length на 0

Почему бы вам не использовать Location вместо refresh для перенаправления.

Чтобы заставить это работать на IIS7, вам нужно использовать isapi с responseBufferLimit="0" в вашем web.config и output_buffering = Off в php.ini, тогда что-то вроде этого должно работать …

  session_write_close(); header( "Location: ".$sURL ) ; // try to allow continued processing if(ob_get_length()) ob_end_clean(); header("Connection: close"); ignore_user_abort(); // optional ob_start(); header("Content-Length: 0"); ob_end_flush(); // Strange behaviour, will not work flush(); // Unless both are called ! 

принятый ответ не работал для меня, но это было сделано. Обратите внимание, что ignore_user_abort () должен быть включен в php.ini

 ignore_user_abort(true); session_write_close(); // optional, this will close the session. header("Location: $url"); header("Content-Length: 0"); ob_end_flush(); flush(); //do_function_that_takes_five_mins(); 

http://waynepan.com/2007/10/11/how-to-use-ignore_user_abort-to-do-process-out-of-band/

В основном, вы ищете асинхронное выполнение задания. Я хотел бы, чтобы php-скрипт создал другой поток (или процесс), который отправляет письма асинхронно. Таким образом, поток, который выполняется в запросе, не привязан к обработке писем. Поток, обрабатывающий запрос и возвращающий результат, может работать полностью отдельно от потока, который отправляет электронные письма.

Этот поток, похоже, затрагивает этот подход, возможно, он будет более полезен в отношении деталей реализации: Запустите задачу PHP асинхронно