2011-07-07 16 views
11

Zastanawiam się, czy istnieje sposób, aby rozpocząć oddzielny wątek w php, aby wysłać i e-mail. Mam małą usługę internetową, która pobiera pewne informacje z aplikacji na iPada, a następnie wstawia dane do bazy danych i wysyła wiadomość e-mail później. Problem polega na tym, że czasami wysyłanie wiadomości e-mail trwa zbyt długo, a czas oczekiwania na iPada przekracza limit czasu. Czy istnieje sposób, w jaki mogę wysłać wiadomość e-mail w oddzielnym wątku? Zasadniczo chcę powiedzieć iPadowi, że wszystko się udało, zanim e-mail wyśle.E-mail w oddzielnym wątku w php

Niektóre przykładowy kod:

... Process info and insert into DB 
echo "success"; //this should be returned to the iPad right away. 

//start new thread here or possibly fork??? 
$email->send(); 

Dzięki!

+0

PHP nie ma natywnej wielowątkowości, ale spójrz na: http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications – feeela

Odpowiedz

5

Jak wskazano, PHP nie ma zdolności wielowątkowości, ale ma wiele funkcji przetwarzania. Możesz utworzyć i wywołać drugi PHP, który pierwszy wywoła w celu przetworzenia wiadomości e-mail. Ten skrypt musiałby działać w wierszu poleceń.

exec('nohup php emailscript.php >/dev/null 2>&1 &'); 

Bardzo ważne jest, aby mieć nohup i wszystko po nim. To, co robi, to umieszczenie procesu w tle i przekierowanie całego wyjścia. W przeciwnym razie PHP będzie czekać na zakończenie i zwróci coś. Nohup upewni się, że skrypt nie zostanie zabity przez system operacyjny, gdy zakończy się proces nadrzędny.

Musisz jakoś przekazać informację e-mail do skryptu. Możesz umieścić informacje w bazie danych i przekazać im identyfikator rekordu, przekazać informacje jako parametry lub szereg innych opcji.

1

Wydaje mi się, że chcesz wykonać polecenie ob_flush(), aby wysłać dane do klienta i zezwolić na kontynuowanie wykonywania skryptu PHP. Pamiętaj, że musisz wysyłać rzeczy z powrotem do klienta, ponieważ nie możesz wysłać więcej po ob_flush().