之前沒接觸過redis,能否詳細給我解釋下如何使用?百度了沒找到典型例子啊
回複內容:
之前沒接觸過redis,能否詳細給我解釋下如何使用?百度了沒找到典型例子啊
用php-worker模式啊。大致應該如此
$cache_data = $redis->get_all();$redis->flush_all();$sqlArr = [];for($item in $cache_data){ array_push($sqlArr,sql_gen($item));}execute_sqls($sqlArr);sleep($sleep_time);
後台運行:
chmod a+x /png/php_daemon #給指令碼加上執行許可權nohup /png/php_daemon >/png/php_daemon.log 2>&1 &
或者添加到/etc/rc.local,讓其開機自啟動運行:
/png/php_daemon >/png/php_daemon.log
php_daemon內容:
#!/png/php/7.0.0/bin/php
補充:
PHP提供有2個預定義變數用於PHP指令碼接收命令列參數:
http://php.net/manual/zh/reserved.variables.php
$argc 傳遞給指令碼的參數個數
$argv[] 傳遞給指令碼的參數數組
getopt可以用於擷取命令列參數選項,返回一個參數名和值的關聯陣列.
http://php.net/manual/zh/function.getopt.php
單獨的字元(不接受值)
後面跟隨冒號的字元(此選項需要值)
後面跟隨兩個冒號的字元(此選項的值可選)
#!/png/php/5.4.39NTS/bin/php
chmod +x cli.php./cli.php -a1024 -b2048 或者 php cli.php -a1024 -b2048
輸出:
Array( [a] => 1024 [b] => 2048)
注釋掉 $argv = getopt("a:b:")
輸出:
Array( [0] => ./cli.php [1] => -a1024 [2] => -b2048)
寫個daemon不停的讀redis就行了。
1.程式啟動
2.讀取新資料(按照timestamp
排序擷取最舊的)
3.沒有資料,sleep 1秒
3.有資料,操作mysql,更新最後一次檢查的時間戳記timestamp
你不知道redis有訊息佇列功能麼,讓其它線程用blpop這種阻塞讀取的模式從隊列裡讀訊息就可以了
用這個:https://github.com/Footstones/Plumber
可以考慮兩種方式:
(1)list作為緩衝,借用producer/consumer模式
(2)Pub/Sub,訂閱訊息,寫MySQL
以前我在stackoverflow上也問過這個問題,好多答案都是說redis用list存,然後設定一個每分鐘跑的cron任務去讀這個list,為什麼不用while (true)
是因為長時間執行的php進程可能會造成記憶體流失。
不過現在我已經在嘗試使用rabbitmq來實現隊列了,效果也很不錯喲。