天天看點

[轉]PHP 下使用 ZeroMQ 和 protobuf

前言 這個記錄總的來說分兩部分: 搭建環境。 簡單使用教程。 搭建環境 安裝 ZeroMQ 庫 首先 PHP 很早之前就安裝了, 是以我不想選擇重新編譯 PHP , 而是想用動态加載子產品的方法來添加這個庫。 正好 zmermq 的官網介紹的有,于是我學會了動态給php安裝庫。

這個記錄總的來說分兩部分:

搭建環境。

簡單使用教程。

首先 PHP 很早之前就安裝了, 是以我不想選擇重新編譯 PHP , 而是想用動态加載子產品的方法來添加這個庫。

正好 zmermq 的官網介紹的有,于是我學會了動态給php安裝庫。

不過安裝 php 版本的 zmq 子產品之前, 需要有 c++ 版本的 zmw 庫。

于是先安裝 c++ 版本的庫。

然後安裝 php 版本的子產品, 和普通安裝隻多了一步: phpize

下載下傳位址在 github 上

這個可以看上面的兩個代碼的差別。

由于 make 的時候就隻編譯有修改的檔案鍊, 而我們的檔案什麼也沒有修改, 是以不會重新編譯。

這個時候就要使用 ​<code>​make -B​</code>​ 強制重新編譯了。

大概錯誤如下

stackoverflow 上找到三個類似的問題 這裡, 這裡, 還有這裡 stackoverflow3.

他們的大概結論就是配置檔案的問題。

而且他們提示指令行可以正常執行的,于是我嘗試在指令行試試,結果真的可以的。

而且 他們都是強調php有兩個配置檔案, 一個是 指令行使用的, 一個是 apache 使用的, 但是我使用 ​<code>​whereis php​</code>​ 找到有 php 的地方, 然後去看, 隻有 ​<code>​/etc/php.ini​</code>​ 這一個地方有。

于是我猜想:最大的可能就是 apache 沒有使用 ​<code>​/etc/php.ini​</code>​ 這個配置檔案。

但是當時我想着指令行能用,就先用指令行吧。

先讓整個用戶端能夠運作起來在說,于是我不管這個問題了。(最後還需要面對這個問題,并找到原因解決了,詳見下面)

protobuf 在 google 的官網上沒有找到 php 版本的源碼, 隻在 github 上找到兩個, 我選擇了 這個。

然後下載下傳安裝

然後指令行可以正常運作了。

由于我隻是在 php 下作為用戶端連結其他地方的服務端, 這裡隻記錄用戶端的使用方法。

看下面的代碼之前可以先看看之前我記錄的一篇 ZMQ 簡單記錄。

語言是相同的,是以了解了一個語言,其他語言很快也能上手的。

首先編寫自己的協定,比如簡單的登陸協定, 儲存為 proto 字尾的檔案,比如 test.proto .

然後使用 protoc-php.php 對我們的協定進行轉換

這個 protoc-php.php 檔案在上面我說的 github 上可以找到, ProtobufCompiler 也要下載下傳的。

執行完之後會輸出一個 php 的檔案, 裡面是用 php 封裝好的我們的協定類。

最後就是使用我們的協定類了。

最終, php 下的 zeromq 和 protobuf 都可以正常運作了, 隻不過是在指令行下運作的。

然後我無意間看到有人說配置檔案不對, 編譯庫的時候需要指定 php-config 。

于是我嘗試了一下

然後浏覽器中竟然沒有 提示找不到 ​<code>​ZMQContext​</code>​ 了。

但是出現了新的問題, 提示: 找不到 ProtobufMessage。

于是使用相同的方法對 protobuf 進行編譯。

good, 沒有提示找不到 ProtobufMessage 了。

但是提示 ​<code>​undefined symbol: zend_new_interned_string in Unknown on line 0​</code>​ .

于是我開始大量的查詢資料了。

第一個是這裡 和 這裡, 但是我這子產品不是通過 pecl 安裝的,是以無效。

但是我還是執行了 ​<code>​php -v​</code>​ 這個參數,提示我是 5.3.3 版本的 php.

然後我又在這裡 和 這裡, 沒有解決問題。

但是它提示我檢視 phpinfo 這個倒是需要做一下。

然後我發現我的 php 版本是 5.6 .

此時我意識到一個問題: 我的這台開發機上安裝了有兩個 php 程式。

當然,我起初搜到這裡, 這裡, 還有這裡,還有這裡,大家都說是 bug, 現在看來不是 bug 了。

既然确定是有兩個 php 版本的緣故, 那就需要先把版本保持一緻再說。

于是我采用比較暴力的方法, 把 ​<code>​/usr/local/php/bin/​</code>​ 裡的檔案複制一份到 ​<code>​/etc/bin/​</code>​ 下面。

當然,覆寫前先把原先的檔案備份一下。

這樣不需要指定路徑再重新編譯一下, 重新開機 apache, 浏覽器通路發現可以正常傳回結果了。

出現這些問題了, 先确認是不是配置檔案的問題, 不是了再确認是不是版本的原因。

《完》

申明

非源創博文中的内容均收集自網上,若有侵權之處,請及時聯絡,我會在第一時間内删除.再次說聲抱歉!!!

博文歡迎轉載,但請給出原文連接配接。