2015-10-26 5 views
2

Я создаю форму, которую заполняет пользователь, а затем я сохраняю ее в db. Затем я извлекаю пользователей, которые соответствуют критериям, и для каждого из них я храню в другой таблице, а также отправляю им электронное письмо.Как запустить php-функцию после перенаправления пользователя на другую страницу?

$userModel = new User(); 
    $currentUser = $userModel->findUserById($user->id); 
    $requestModel = new Requests(); 
    $success = $requestModel->saveRequest($currentUser->usr_id, $tagId, $title, $task, $fixed, $price, $hour, $quality, $multiple, $datetime, $postal, $cityId, $travel); 
       if($success){ 
        $request = $requestModel->getUserLatestRequest($currentUser->usr_id); 
        if($request){ 
         $user = new User(); 
         $alluserids= $user->getAllSkillCityUserIds($cityId, $tagId); 
         $targetId = (array_column($alluserids, 'usr_id')); 
         //error_log("<pre>targetId".print_r($targetId,true)."</pre>"); 
         foreach($targetId as $target) { 
          if($target == $currentUser->usr_id){ 
           continue; 
          } 
          $lead = new RequestsLead(); 
          $lead->addRequest($request->req_id, $request->req_userid, $target); 

          $contractor = $userModel->findUserbyId($target); 
          $nemail = new NotificationsEmail(); 
          $nemail->sendGotRequest($contractor->usr_email, $contractor->usr_firstname); 
         } 
        } 
        $this->flash->success('<div data-toggle="notify" data-onload data-message="Thanks for using our service!." data-options="{"status":"success"}" class="hidden-xs"></div>'); 
        $this->response->redirect($this->url->get("")); 
       }else{ 
        $this->flash->error('<div data-toggle="notify" data-onload data-message="Sorry! Please try again." data-options="{"status":"danger"}" class="hidden-xs"></div>'); 
        $this->response->redirect($this->url->get("request")); 
       } 

Проблема возникает, когда есть много пользователей, и эта функция будет необходимо завершить работу до того, как пользователь перенаправляется обратно на страницу с сообщением вспышки. Как я могу изменить это, поэтому сначала перенаправляю пользователя на страницу с помощью флэш-сообщения, затем запускаем функции php foreach, хранящиеся в db и отправляющие электронные письма после?

Я попытался переключить порядок функций, но как только пользователь перенаправлен с помощью флэш-сообщения, функции php перестали работать.

+1

попробовать 'ignore_user_abort()', который должен держать свой скрипт работает независимо от того, когда клиент отсоединяется –

+0

@MarcB Спасибо, что указал на эту функцию php. – Blkc

ответ

3

PHP является server side scripting language. Это существенно (но не полностью) без гражданства.

Это означает, что при загрузке страницы PHP она выполняет требуемый PHP-код на сервере и затем отправляет ответ браузеру. Невозможно повторно выполнить PHP-код после того, как страница была отправлена ​​клиенту без нового вызова на сервер.

В вашем случае вы перенаправляете клиентов на новую страницу PHP. Это здорово, но новая страница PHP - это новый скрипт, запущенный на сервере, у него нет понятия о том, что делала предыдущая страница.

Чтобы выполнить код PHP ПОСЛЕ загрузки страницы, вам необходимо будет использовать AJAX для отправки запроса на сервер PHP для выполнения этого запроса в фоновом режиме, если вы хотите сделать это, не перенаправляя пользователя снова , или перенаправить пользователя снова после отображения сообщения «flash».

Обратите внимание, что с помощью AJAX вы также можете использовать исходную страницу - без какого-либо перенаправления - для выполнения этого запроса И для отображения флэш-сообщения (в то же время!).

Для получения более подробной информации о данных обмена между страницами:

Для получения дополнительной информации о AJAX запросов и PHP:

+0

Привет, спасибо за ответ. Предполагая, что я использую ответ Ajax, и пользователь видит ответ (ответ Ajax «true» для успешного POST), но затем пользователь начал делать другие действия на странице, выполняет ли php-функцию еще? – Blkc

+1

@Blkc Да. Когда вы отправляете запрос AJAX на PHP-сервер, запрос PHP будет продолжать работать, даже если пользователь перейдет на новую страницу. Остановка загрузки страницы или переход на новую страницу только говорит браузеру на стороне клиента прекратить прослушивание ответа от вызова AJAX - он не может сказать серверу отменить вызов PHP, который был сделан на сервере. – Mark

+1

Я вижу. Большое спасибо за разъяснение. Думаю, я буду использовать 'ignore_user_abort(); для этого связывается связь с Ajax. – Blkc

2

Что вы упомянули, потребуется некоторый путь для того, чтобы сценарий продолжал работать за пределами ответа, отправляемого обратно пользователю. PHP не работает таким образом - вы можете начать писать контент в выходной буфер, но браузер все равно ждет, пока весь ответ не будет возвращен.

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

Смежные вопросы