PHP 非同步執行方法,類比多線程的應用分析_php執行個體

來源:互聯網
上載者:User
PHP 本身沒有多線程的東西,但可以曲線的辦法來造就出同樣的效果,比如多進程的方式來達到非同步呼叫,只限於命令模式。
另外還有一種更簡單的方式可用於 Web 程式中,那就是用 fsockopen()、fputs() 來請求一個 URL, 而無需等待返回,如果你在那個被請求的頁面(URL)中做些事情就相當於非同步了。
關鍵代碼如下:
複製代碼 代碼如下:

<?php
  $fp = fsockopen('localhost',80,&$errno,&$errstr,5); 
  if(!$fp)
     {
         echo "$errstr ($errno)<br />/n";
     }
     fputs($fp,"GET another_page.php?flag=1/r/n");
     fclose($fp);

上面的代碼向頁面 another_page.php 發送完請求就不管了,用不著等待請求頁面的響應資料,利用這一點就可以在被請求的頁面 another_page.php 中非同步做些事情了。
比如,一個很切實的應用,我們每當發表了一篇新日誌後需要給所有該日誌的訂閱者發個郵件通知, 如果按 照通常的方式就是:
日誌寫完 -> 點提交按鈕 -> 日誌插入到資料庫 -> 發送郵件通知 -> 告知撰寫者發布成功
那麼作者在點提交按鈕到看到成功提示之間可能會等待很常時間,基本是在等郵件發送的過程,比如串連郵件服務異常、或器緩慢或是訂閱者太多。而實際上是不管郵件發送成功與否,保證日誌儲存成功基本可接受的,所以等待郵件發送的過程是很不經濟的,這個過程可非同步來執行,並且郵件發送的結果不太關心或以日誌形式記錄備查。
改進後的流程就是:
日誌寫完 -> 點提交按鈕 -> 日誌插入到資料庫 ---> 告知撰寫者發布成功
                                                           └ 發送郵件通知 -> [記下日誌]
寫個實際的程式來測試一下,有兩個檔案,分別是 write.php 和 sendmail.php,在 sendmail.php 用 sleep(seconds) 來類比程式執行所使用時間。
write.php,執行耗時 1 秒:
複製代碼 代碼如下:

 <?php 
  function asyn_sendmail()
     {
         $fp = fsockopen('localhost',80,&$errno,&$errstr,5); 
      if(!$fp)
         {
            echo "$errstr ($errno)<br />/n";
         }
     sleep(1);
     fputs($fp,"GET /sendmail.php?param=1/r/n"); #請求的資源 URL 一定要寫對
     fclose($fp);
    } 
 echo time().'<br>';
 echo 'call asyn_sendmail<br>';
 asyn_sendmail();
 echo time().'<br>';

sendmail.php,執行耗時 10 秒:
複製代碼 代碼如下:

<?php
sleep(10);
fopen("C:/" . time(),  "w"); 

通過頁面訪問 write.php,頁面輸出:
1272472697
call asyn_sendmail
1272472698
並且在 C:/ 組建檔案:
1272472708
從上面的結果可以看出 sendmail.php 至少花費 10 秒,但不會阻塞 write.php 繼續往下執行,表明這一過程是非同步。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.