我自己用C++寫的一個PHP擴充,編譯安裝好之後,問題來了,請君聽我慢慢道來。
1,為了測試,我寫了個測試指令碼ctp.php
";if(function_exists("helloWorld")){echo "exist\n";}else{echo "none exist\n";}echo helloWorld('baren')
2,在瀏覽器和命令列上分別運行結果如下:
3,我的問題:
1)為什麼在瀏覽器中不能列印出函數hellWorld()的值 ?
2)如何修正此錯誤,需要更改什麼設定檔嗎?
3)網上搜尋過太多的解決方案,例如改許可權,改環境變數,均不能解決。所以我最後的一個問題是,是不與開發環境有關?
4,我的開發環境:
os version :centos 7 x86_64
php version:5.4.43
webserver :Apache/2.4.16 (Unix)
請有過擴充編寫部署經驗的同行給予協助?
在下謝過!
回複討論(解決方案)
我只知道php運行cli模式下用的設定檔和執行web用的設定檔是不一樣的,你應該將你的擴充也添加到運行web的那個設定檔裡面
web用的是/usr/local/php/etc/php.ini這個設定檔
cli應該是這個/etc/php.ini
感謝你的回答,不過你的回答是錯的。
你的錯誤如下:
1,CLI 和WEB的設定檔都是一樣的。而且我在做部署時只是將我的擴充設定檔ctpextension.ini放在了Scan this dir for additional .ini files 預設的目錄下面 :/usr/local/php/php.d 當PHP載入設定檔時會自動檢查這個目錄並把ctpextension.ini 檔案裡的內容追加到php,ini裡面。
2,你說:“cli應該是這個/etc/php.ini” 我也發現我的系統裡有這個檔案目錄,於是我把這個檔案刪除 ,然後在命令列運行指令碼同樣能夠得到結果。證明你的說法有誤。
關於 additional .ini files 你可以閱讀這裡: http://php.net/manual/zh/function.php-ini-scanned-files.php
命令列是即時載入php的,而web不是,修改php配置如加擴充後,需要重啟伺服器才會生效。
命令列是即時載入php的,而web不是,修改php配置如加擴充後,需要重啟伺服器才會生效。
謝謝你的提醒,我不會犯這麼低級的錯誤
大家不要再猜測了,這個問題我請教一個國外的開發人員解決了。
其實這個問題跟配置沒有關係,我的配置是正確的,不然就不會在命令列跟瀏覽器端都顯示我的函數已經存在。
問題的原因是:我自己寫的PHP擴充庫依賴的第三方庫已經更行了,而我不知情,還是看得老版本的文檔,
所以就出現瀏覽器不輸出結果的問題。
我只需要把我的C++檔案裡面的std::cout 改成Php::out 即可
給大家看看我期待已久的結果圖吧