作爲標題,我正在尋找一個支持持久連接的php Redis客戶端,因爲我的Web應用程序接收到很多請求(每個請求都會將一個項目放入Redis隊列中),我想避免創建新的連接每個請求。有沒有任何PHP的Redis客戶端支持持久連接?
回答
不確定這是否受支持,但您絕對應該看看Predis和Rediska,這兩款(特別是Predis AFAIK)是最好的PHP Redis客戶端。
PHP-Redis支持持久性連接,因爲它使用C語言編寫的php擴展,這使得它可以在請求之間共享連接。看看popen and pconnect的文檔。
Predis 不能支持持久性連接,因爲它是100%PHP和PHP之間不分享任何請求。
據Predis作者說,這個答案是不正確的。他聲稱,當PHP進程被配置爲在請求之間保持駐留時,PHP請求可以共享信息,就像許多實現一樣。 – kevinlawler 2011-05-11 19:26:20
同意,這個答案是錯誤的。無論如何,'popen()'是錯誤的資源類型(p ==管道進程)。 'pconnect()'完全有能力支持Zend內部的「xport」資源處理,它允許持久連接被維護。 Predis本身使用[stream_socket_client()](http://php.net/stream_socket_client),並帶有一個可選的STREAM_CLIENT_PERSISTENT標誌。當PHP進程由類似Apache的後端進程/線程池維護時,這些持久連接在後端的生命週期內存活。 – Joe 2011-11-21 23:13:20
Predis支持持久連接使用它PhpiredisStreamConnection
以來v0.8.0的persistent=1
旗標語:
<?php
$client = new Predis\Client('tcp://127.0.0.1?persistent=1', array(
'connections' => array(
'tcp' => 'Predis\Connection\PhpiredisStreamConnection',
'unix' => 'Predis\Connection\PhpiredisStreamConnection',
),
);
我用PhpiredisStreamConnection添加了persistant = 1,看起來我終究還是得到了相同的TIME_WAIT套接字。 – 2014-06-11 14:31:59
PhpRedis目前支持持久連接。使用PHP 7.0和PhpRedis 3.0,使得與pconnect()
這樣的永久連接:
for ($i=0;$i<1000;$i++) {
$redis = new Redis();
$result = $redis->pconnect('127.0.0.1');
$redis->set("iterator",$i);
$response=$redis->get("iterator");
$redis->close();
unset($redis);
}
是(每9.6毫秒VS 0.83毫秒連接)比connect()
快約10倍:
for ($i=0;$i<1000;$i++) {
$redis = new Redis();
$result = $redis->connect('127.0.0.1');
$redis->set("iterator",$i);
$response=$redis->get("iterator");
$redis->close();
unset($redis);
}
注:「此功能在線程版本中不可用「。 (我在Windows下運行IIS,所以我運行NTS版本。)
Predis支持持續連接。你只需要添加持久paramater爲1
您可以使用下面
$client = new Predis\Client(array(
'scheme' => 'tcp',
'host' => '127.0.0.1',
'port' => 6379,
'database' => 15,
'persistent'=> 1
));
的代碼,而不是
$client = new Predis\Client('tcp://127.0.0.1:6379?database=15');
,你可以從這裏找到更多的連接參數: https://github.com/nrk/predis/wiki/Connection-Parameters
- 1. 與客戶端的持久連接
- 2. 單個redis客戶端連接是否支持併發讀寫?
- 3. 沒有可用的客戶端連接器支持所需的協議:'HTTP'
- 4. Python持久TCP客戶端
- 5. 客戶端持久套接字
- 6. 如何使用Spray客戶端進行持久HTTP連接
- 7. Tornado AsyncHTTPClient支持持久連接嗎?
- 8. 持久連接的基本客戶端 - 服務器設計?
- 9. 服務器到客戶端的更新沒有來自客戶端的持續/持久請求Websocket編程
- 10. VMware ESXi6.5u1客戶端支持
- 11. Jmeter支持客戶端javascript
- 12. 多個客戶端支持
- 13. 客戶端支持8
- 14. PHP MongoDB持久連接
- 15. 這個操作沒有WCF測試客戶端錯誤支持
- 16. 持久連接
- 17. 怎樣才能連接使用PHP的Redis,但沒有使用客戶端庫
- 18. 當客戶端斷開連接時支持MongoDB的寫入
- 19. 帶連接池支持的Golang cassandra客戶端
- 20. redis是否支持服務器和客戶端之間的UDP
- 21. WCF4(.NET Framework 4)是否支持客戶端連接池?
- 22. xdebug沒有連接客戶端?
- 23. 客戶端隊列持久性
- 24. 骨幹客戶端持久層?
- 25. MySQL持久連接
- 26. mysql持久連接
- 27. 有沒有任何的PHP CalDav客戶端庫?
- 28. redis pub/sub模型是否需要持久連接到redis?
- 29. 支持Windows的SVN Mercurial客戶端
- 30. PHP的mysqli的持久連接錯誤
謝謝你antirez,我從來沒有嘗試Predis之前,它似乎支持持久連接,我相信一個C實現爲php模塊應該加快速度,但我會嘗試一下並進行比較。 – secmask 2010-09-02 14:20:49
關注Predis是否支持持續連接,因爲它是純粹的PHP實現,而不是基於C的擴展。 根據維護者的說法,如果您的PHP進程配置爲保持常駐,Predis確實支持持久連接。這是典型的嚴重生產PHP + Apache設置,雖然您的特定安裝可能會有所不同,可能需要一些配置。 [Predis FAQ](https://github.com/nrk/predis/blob/master/FAQ.markdown)指出,當Predis持久化並且PHP進程被回收用於請求時,連接是持久的。 – kevinlawler 2011-05-11 19:15:36
免責聲明:我還沒有測試Predis。我首先嚐試C擴展,因爲Predis看起來是用非常冗長的風格構建的。我也不喜歡依賴於PHP的自動加載機制。 – kevinlawler 2011-05-11 19:22:03