我使用了laravel 4 framework開發,想把cache server從memcache切換到redis,在config/cache.php的driver設定為redis。但是調用cache::get()報錯,報錯資訊如:
[2014-10-21 18:47:44] production.ERROR: exception 'Predis\Connection\ConnectionException' with message 'Error while reading line from the server [tcp://127.0.0.1:6379]' in /home/nginx/mono/vendor/predis/predis/lib/Predis/Connection/AbstractConnection.php:141
但是從redis-cli訪問redis-server是ok的,在phpunit中單獨測試redis也沒問題。但是在Route中直接使用有問題。
Route::get('/test', function(){ Cache::put('name', 'Taylor', 60); //報錯! $name = Cache::get('name'); echo $name;});
誰能解釋下問題在哪?
補充:重新整理多次/test,會有幾次正常。
回複內容:
我使用了laravel 4 framework開發,想把cache server從memcache切換到redis,在config/cache.php的driver設定為redis。但是調用cache::get()報錯,報錯資訊如:
[2014-10-21 18:47:44] production.ERROR: exception 'Predis\Connection\ConnectionException' with message 'Error while reading line from the server [tcp://127.0.0.1:6379]' in /home/nginx/mono/vendor/predis/predis/lib/Predis/Connection/AbstractConnection.php:141
但是從redis-cli訪問redis-server是ok的,在phpunit中單獨測試redis也沒問題。但是在Route中直接使用有問題。
Route::get('/test', function(){ Cache::put('name', 'Taylor', 60); //報錯! $name = Cache::get('name'); echo $name;});
誰能解釋下問題在哪?
補充:重新整理多次/test,會有幾次正常。
Predis的StreamConnection Class
/** * Initializes a TCP stream resource. * * @param ConnectionParametersInterface $parameters Parameters used to initialize the connection. * @return resource */protected function tcpStreamInitializer(ConnectionParametersInterface $parameters){ $uri = "tcp://{$parameters->host}:{$parameters->port}"; $flags = STREAM_CLIENT_CONNECT; if (isset($parameters->async_connect) && $parameters->async_connect) { $flags |= STREAM_CLIENT_ASYNC_CONNECT; } if (isset($parameters->persistent) && $parameters->persistent) { $flags |= STREAM_CLIENT_PERSISTENT; $uri .= strpos($path = $parameters->path, '/') === 0 ? $path : "/$path"; } $resource = @stream_socket_client($uri, $errno, $errstr, $parameters->timeout, $flags); if (!$resource) { $this->onConnectionError(trim($errstr), $errno); } //問題在這裡,需要給讀取流設定逾時時間,否則就在讀取流資料時串連報錯, //可以直接設定read_write_timeout為0,以此解決問題。 if (isset($parameters->read_write_timeout)) { $rwtimeout = $parameters->read_write_timeout; $rwtimeout = $rwtimeout > 0 ? $rwtimeout : -1; $timeoutSeconds = floor($rwtimeout); $timeoutUSeconds = ($rwtimeout - $timeoutSeconds) * 1000000; stream_set_timeout($resource, $timeoutSeconds, $timeoutUSeconds); } if (isset($parameters->tcp_nodelay) && function_exists('socket_import_stream')) { $socket = socket_import_stream($resource); socket_set_option($socket, SOL_TCP, TCP_NODELAY, (int) $parameters->tcp_nodelay); } return $resource;}
production.ERROR
config 中是否有 production 檔案夾?裡面是否有 cache.php 檔案?那樣的話會覆蓋外面的配置。