被swoole坑哭的PHP程序員

被swoole坑哭的PHP程序員

2015-09-16 09:57 文帥營 博客園 字號: T | T
一鍵收藏,隨時查看,分享好友!

首先說一下對swoole的理解:披着PHP外衣的C程序。不少PHPer朋友看到swoole提供的強大功能、外界對其的崇拜便躍躍欲試的安裝、調 試其demo、編寫新功能,而後興奮的奔走相告。php

AD:51CTO 網+首屆APP創新評選大賽火熱啓動——超百萬資源等你拿!linux

 

本文主要記錄一下學習swoole的過程、填過的坑以及swoole究竟有多麼強大!c++

首先說一下對swoole的理解:披着PHP外衣的C程序。不少PHPer朋友看到swoole提供的強大功能、外界對其的崇拜便躍躍欲試的安裝、調 試其demo、編寫新功能,而後興奮的奔走相告。沒過幾天當你按照本身的理解繼續用swoole時,發現代碼並無按照本身的預期運行,而後開始破口大 罵,什麼破東西呀,代碼跟demo基本同樣,爲啥運行不通呢?什麼狗屁work、task、共享內存、ipcs、異步,各類問題涌現,而後迅速去查官方文 檔,發現文檔中居然對這些並無說起,只是簡單的介紹怎麼使用,此時幾乎對swoole喪失但願。程序員

被swoole坑哭的PHP程序員

遇到的幾點問題:web

1:關於phper經常使用的全局變量(global)爲何在onRequest函數中不能使用。ajax

由於swoole是多線程編程,global是不能在多個進程間共享的。例數據庫

 

  1. global $i = 0; 
  2.  
  3. function onRequest() { 
  4.  
  5.     echo $i++; 
  6.  

若是在swoole中寫一個上面的程序,並不會每次訪問輸出一個遞增的數字。若是要實現預期的效果,須要使用swoole_table的相關函數。編程

2:什麼是異步、什麼是回高瀏覽器

對於phper來講,對異步、回調的理解估計就是ajax。當看到swoole裏面對異步、回調的解釋,貌似很簡單的樣子,就這樣在沒有任何多線程編輯經驗的時候貿然用了swoole,結果被坑的偷偷擼代碼好幾個通宵來填本身的坑。服務器

3:爲何onReceive收到的數據這麼大

客戶端發送的屢次請求,服務端是能夠一次性接收的。並非客戶端發送一次,服務端接收一次

4:自制httpserve

寫一個http服務端,而後經過瀏覽器訪問這個自制的服務器,刷新一次瀏覽器,服務端爲何爲接收到兩次請求?這個問題估計困饒了好多初次用swoole寫httpserver的朋友。由於瀏覽器會多發一個favicon.ico請求。

緣由

出現這種狀況的緣由其實很簡 單,大部分phper都只會php這一種語言,主要用途就是作web,寫業務邏輯。不多去了解服務器程序的開發。有一次一個朋友用swoole寫了一個簡 單的服務端,一個客戶端,跑過來問我爲何都啓動了卻都收不到數據,我簡單看了下代碼,全部鏈接確實都成功了,兩端都設置了onReceive回調,代碼 沒問題,看到最後才發現他的服務端、客戶端都設置了接到消息的回調函數,可是兩端都沒有向對方發消息,兩端處於僵持狀態。而後swoole官方對於這種常 識問題沒有給出說明,只是說如何設置回調、如何發消息,如何這樣,如何那樣。對於有服務端開發經驗的同窗來講,確定不會遇到這種問題,swoole文檔也 不須要指明須要這樣作,由於這是常識。但對於phper來講,指明這一點是很是重要的,由於如上面所說phper是沒有這方面認知的,只有服務端開發經驗 的程序員有才會有。

swoole的特點:網絡通訊 框架、異步、多線程。這些特性正是php所不完善的功能(雖然官方提供不少基礎函數能夠實現這些功能,而後缺乏中文文檔,不多有人用php來實現這部分功 能),普通的phper也不具有這些特性的基礎認知,因此貿然使用swoole不免會遇到一些根本在swoole官方查不到的常識問題。

使用swoole必需要掌握的技能

  1. 多線程編程

  2. 進程間通訊

  3. 網絡協議TCP/UDP的認知

  4. PHP的各項基本技能

我的學習swoole的經歷

在好久以前我也是一個只會 php的程序員,後來一次偶然機會須要用httpsqs,用了一段時間後發現有一些個性的需求,因而就開始看源碼。這真是不看不知道,一看嚇一 跳,httpsqs只是一層簡單的包裝,內部是一個Tokyo Cabinet數據庫,印象中封裝的代碼也就一百多行。主要思路就是用C語言的libevent作了一個http服務器,接收請求讀寫tokyo cabinet數據庫,當時按照這種思路作出來的程序確實很多。後來我就突發奇想,既然C語言能夠用libevent函數,那PHP確定也能夠用 libevent監聽網絡,接收請求後讀寫數據庫作隊列服務。後來通過查php官方文檔,PHP確實提供一系統完整的函數來完成這些功能,甚至多線程的全 套函數都有提供,但中文文檔太少,網上也不多搜索到成熟的代碼。在逼不得已的狀況下,補習了linux-C多線程開發的基本原理,進程間通訊的經常使用方法, 也用來作了一些簡單的demo。惟一的感受就是寫一個簡單的功能,設計起來還真複雜。就在快要放棄的時候,swoole出現了。swoole所提供的功能 正是php所缺失的功能,簡直是太棒了。swoole作爲一種網絡通訊框架,只須要簡單的幾行設置,一個服務器就搭建起來了,之後就是不斷的去完善業務代 碼。以前在libevent交流羣中得知swoole的設計在c\c++中並非最好的框架設計,但其亮點就是把基本功能用C封裝好,業務功能留給世界上 最好的語言PHP來編寫。自此便開始了swoole的填坑之旅。

總結

swoole並非一個簡單的PHP框架,正如swoole官方首頁的第一句話「從新定義PHP」,千萬不要用舊有php的思想來寫swoole代碼!swoole從新激活了PHP,php成就了swoole!

相關文章
相關標籤/搜索