(转)php-cli模式学习(PHP命令行模式)
php-cli模式學習(PHP命令行模式)
之前知道php—cli模式是一種類似shell命令式的執行php程序,不過一直以為這個是一種落后的方式,應該沒有什么意義,因為從沒有遇到過使用這個cli模式編程的。不過今天遇到了使用cli模式的應用。
php_cli模式簡介
php- cli是php Command Line Interface的簡稱,如同它名字的意思,就是php在命令行運行的接口,區別于在Web服務器上運行的php環境(php-cgi, isapi等) 也就是說,php不單可以寫前臺網頁,它還可以用來寫后臺的程序。 PHP的CLI shell腳本適用于所有的PHP優勢,使創建要么支持腳本或系統甚至與GUI應用程序的服務端!——注:windows和linux下都支持 php_cli模式
PHP-cli應用場景:
1.多線程應用
這方面的好處,引用鳥哥的話:
優點: 1. 使用多進程, 子進程結束以后, 內核會負責回收資源
2. 使用多進程,子進程異常退出不會導致整個進程Thread退出. 父進程還有機會重建流程.
3. 一個常駐主進程, 只負責任務分發, 邏輯更清楚.
php 的多線程—沒錯就是php多線程應用,雖然大家都普遍認為php沒有多線程(curl屬于模擬多線程而不是真實的),但是在php_cli模式下的php 徹底的是屬于多線程。這個時候php屬于linux的一個守護進程。 在本人之前寫過的《PHP多線程批量采集下載美女圖片(續)》的時候在采集程序里雖然使用curl來模擬多線程,但是在瀏覽器執行的時候也是會遇到執行超 時或內存abort而導致程序中斷,(要嘗試幾次才可以徹底成功),但是如果在php-cli模式下執行,你就會發現這個程序執行的很快,php多線程執 行的優勢被徹底表現出來了.
備注:這種多線程方式不是很成熟,不適合大規模的生成應用,偶爾使用還是可以的
2.定時執行php程序
之前本人總結關于《PHP定時執行計劃任務》的三種方式,利用有一張就是利用linux的cron方式,那么這個方式是如何定時執行php程序?請看下文
3.開發桌面程序
你 可以做您的Windows或Linux中使用PHP的圖形用戶界面(GUI)應用!所有你需要的是PHP的命令行接口和一包GTK。這將允許建立真正的便 攜式圖形用戶界面應用程序(呵呵,之前只是知道php可以做桌面程序,現在才知道是使用php_cli模式),并且不需要學習別的。
4.編寫PHP的shell腳本
如果你不會bash shell或者Perl等的使用,但是你又需要一些腳本去執行的時候,怎么辦?這個時候你完全可以使用你熟悉的php編寫shell腳本,這個時候你是不是突然感覺PHP是不是太強大了!—–真正做到一種語言,到處開發!
PHP_CLI使用方法
win下面的執行方法:
假設php.exe 在D:\xampp\php在dos命令在可以這個執行:
1?? ?D:\xampp\php\php.exe? D:\xampp\htdocs\test.php
就可以執行test.php這個文件了 。這里推薦win平臺下xampp集成環境,真正比wamp強大N倍,這個集成包可以直接進入dos模式。
linux下php_cli使用
首先找到你安裝php的路徑,以我為例:
image
php安裝在路徑/usr/local/php/bin/php下
1?? ?/usr/local/php/bin/php /usr/local/apache/htdocs/a.php
就可以執行a。php文件
PHP_CLI編程需知
如何檢測環境支持php_cli模式?
1?? ?<?php
2?? ?//方法1
3?? ?if (PHP_SAPI === 'cli')
4?? ?{
5?? ??? // ...
6?? ?}
7?? ?//方法2
8?? ?if (php_sapi_name() === 'cli')
9?? ?{
10?? ??? // ...
11?? ?}
?
PHP_ClI如何接收參數?
默認情況下/usr/local/php/bin/php接收參數是$argv,這個變量是固定的!在php文件中var_dump($argv);
得到下面結果:
image
可以寫個簡單的處理函數把這個方式轉化為大家常用的GET/post的參數模式。
簡單代碼:
1?? ?<?php
2?? ?
3?? ?function parseArgs($argv){
4?? ???? array_shift($argv);
5?? ???? $out = array();
6?? ???? foreach ($argv as $arg){
7?? ???????? if (substr($arg,0,2) == '--'){
8?? ???????????? $eqPos = strpos($arg,'=');
9?? ???????????? if ($eqPos === false){
10?? ???????????????? $key = substr($arg,2);
11?? ???????????????? $out[$key] = isset($out[$key]) ? $out[$key] : true;
12?? ???????????? } else {
13?? ???????????????? $key = substr($arg,2,$eqPos-2);
14?? ???????????????? $out[$key] = substr($arg,$eqPos+1);
15?? ???????????? }
16?? ???????? } else if (substr($arg,0,1) == '-'){
17?? ???????????? if (substr($arg,2,1) == '='){
18?? ???????????????? $key = substr($arg,1,1);
19?? ???????????????? $out[$key] = substr($arg,3);
20?? ???????????? } else {
21?? ???????????????? $chars = str_split(substr($arg,1));
22?? ???????????????? foreach ($chars as $char){
23?? ???????????????????? $key = $char;
24?? ???????????????????? $out[$key] = isset($out[$key]) ? $out[$key] : true;
25?? ???????????????? }
26?? ???????????? }
27?? ???????? } else {
28?? ???????????? $out[] = $arg;
29?? ???????? }
30?? ???? }
31?? ???? return $out;
32?? ?}
33?? ?var_dump($argv);
34?? ?var_dump(parseArgs($argv));exit;
執行結果:
image
當然實現的方法不止一個,大家可以嘗試其他方法實現!
例外關于php的cli還有很多參數可以加入:具體可以參考:http://php.net/manual/en/features.commandline.php
關于定時執行
cron是一個linux下的定時執行工具,可以在無需人工干預的情況下運行作業,周期性作業,比如備份數據 打開/etc/crontab,添加:
?/usr/bin/php -f /data/htdocs/test.php
關于corntab的詳細使用參考51cto專題:Linux計劃任務——cron服務
轉載于:https://www.cnblogs.com/phpdragon/archive/2013/03/21/2972370.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的(转)php-cli模式学习(PHP命令行模式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 说反弹言之过早
- 下一篇: PostgreSQL消息乱码的解决