phpsapicli
① php鐚滄暟瀛椾唬鐮
鐚滄暟娓告垙鏈変袱縐嶇帺娉曪細
絎涓縐嶏細涓や釜浜虹帺錛屼竴鏂瑰嚭鏁板瓧錛屼竴鏂圭寽銆傚嚭鏁板瓧鐨勪漢瑕佹兂濂戒竴涓鎸囧畾浣嶆暟鐨勬暟錛屾暟瀛楀彲閲嶅嶏紝涓嶈兘璁╃寽鐨勪漢鐭ラ亾銆
鐚滅殑浜哄氨鍙浠ュ紑濮嬬寽銆傛瘡鐚滀竴涓鏁幫紝鍑烘暟鑰呭氨瑕佽村ぇ榪囨垨灝忚繃鍑虹殑鏁般
絎浜岀嶏細涓や釜浜虹帺錛屼竴鏂瑰嚭鏁板瓧錛屼竴鏂圭寽銆傚嚭鏁板瓧鐨勪漢瑕佸厛鎯沖ソ涓涓娌℃湁閲嶅嶆暟瀛楃殑4浣嶆暟錛屼笉鑳借╃寽鐨勪漢鐭ラ亾銆傜寽鐨
浜哄氨鍙浠ュ紑濮嬬寽銆傛瘡鐚滀竴涓鏁幫紝鍑烘暟鑰呭氨瑕佹牴鎹榪欎釜鏁板瓧緇欏嚭鍑燗鍑燘錛屽叾涓瑼鍓嶉潰鐨勬暟瀛楄〃紺轟綅緗姝g『鐨勬暟鐨勪釜鏁幫紝鑰
B鍓嶇殑鏁板瓧琛ㄧず鏁板瓧姝g『鑰屼綅緗涓嶅圭殑鏁扮殑涓鏁般傚傛g『絳旀堜負5234錛岃岀寽鐨勪漢鐚5346錛屽垯鏄1A2B錛屽叾涓鏈変竴涓5鐨勪綅
緗瀵逛簡錛岃頒負1A錛岃3鍜4榪欎袱涓鏁板瓧瀵逛簡錛岃屼綅緗娌″癸紝鍥犳よ頒負2B錛屽悎璧鋒潵灝辨槸1A2B銆傛帴鐫鐚滅殑浜哄啀鏍規嵁鍑洪樿呯殑
鍑燗鍑燘緇х畫鐚滐紝鐩村埌鐚滀腑涓烘銆
涓嬮潰鏄疨HP浠g爜瀹炵幇錛
<?php
//鏍囧噯杈撳叆嫻佸拰鏍囧噯杈撳嚭嫻
$stdin=null;
$stdout=null;
/**
*鍒濆嬪寲IO嫻
*/
functioninit(){
global$stdin;
global$stdout;
$stdin=fopen('php://stdin','r');
$stdout=fopen('php://stdout','w');
}
/**
*鍏抽棴IO嫻
*/
functiondestroy(){
global$stdin;
global$stdout;
if(is_resource($stdin)){
fclose($stdin);
}
if(is_resource($stdout)){
fclose($stdout);
}
}
/**
*浠庡懡浠よ岃誨彇涓琛屾暟鎹
*/
functionread(){
global$stdin;
$line=fgets($stdin);
returntrim($line,PHP_EOL);//鍘婚櫎鎹㈣岀
}
/**
*鍚戝懡浠よ岃緭鍑轟竴琛屾暟鎹
*/
functionwrite($line){
global$stdout;
//杞鎹㈢紪鐮
if(stripos(PHP_OS,'winnt')!==false){
$line=iconv('UTF-8','GBK',$line);
}
fwrite($stdout,$line.PHP_EOL);
}
/**
*絎涓縐嶇帺娉
*@param$count浣嶆暟
*/
functionguess_the_number($count=2){
//闅忔満鐢熸垚涓涓$count浣嶆暟
$min=pow(10,$count-1);
$max=pow(10,$count)-1;
$number=rand($min,$max);
init();
while(1){
write(sprintf('Pleaseinputyournumber(%s-bitdigit),qorquitexit:',$count));
$readStr=read();
//exitprogram
if($readStr=='q'||$readStr=='quit'){
break;
}
$readInt=intval($readStr);
if($readInt>$number){
write('澶т簡');
}elseif($readInt<$number){
write('灝忎簡');
}else{
write('鎮鍠滀綘錛岀寽瀵逛簡!');
write('Inputccontinuetoplay');
$readStr=read();
if($readStr=='c'||$readStr=='continue'){
$number=rand($min,$max);
}else{
break;
}
}
}
destroy();
}
/**
*寰楀埌涓涓娌℃湁閲嶅嶆暟瀛楃殑鍥涗綅鏁
*/
functiongetRandNumber(){
$num=rand(1,9);
$array=array_diff(array(0,1,2,3,4,5,6,7,8,9),[$num]);
shuffle($array);
$subarr=array_slice($array,0,3);//鍐嶅彇3涓鏁板瓧
$str=implode('',array_merge([$num],$subarr));
returnintval($str);
}
/**
*絎浜岀嶇帺娉
*/
functionguess_the_number2(){
$number=getRandNumber();
$len=4;//鍥涗綅鏁
init();
while(1){
write(sprintf('Pleaseinputyournumber(%s-bitdigit),qorquitexit:',$len));
$readStr=read();
//exitprogram
if($readStr=='q'||$readStr=='quit'){
break;
}
$readInt=intval($readStr);
if($readInt==$number){
write('鎮鍠滀綘錛岀寽瀵逛簡!');
write('Inputccontinuetoplay');
$readStr=read();
if($readStr=='c'||$readStr=='continue'){
$number=getRandNumber();
}else{
break;
}
}else{
//鍒ゆ柇鍑燗鍑燘
$readInt=str_pad($readInt,$len,'0',STR_PAD_LEFT);//涓嶈凍鍥涗綅鐨勮ˉ瓚沖洓浣
$number=strval($number);
$readArr=str_split($readInt,1);//casttoarray
$numArr=str_split($number,1);
$aval=0;//鍑燗
$bval=0;//鍑燘
for($i=0;$i<$len;$i++){
if($readArr[$i]==$numArr[$i]){
$aval++;
unset($readArr[$i],$numArr[$i]);
}
}
$bval=count(array_intersect($readArr,$numArr));
write(sprintf('%sA%sB',$aval,$bval));
}
}
destroy();
}
if(PHP_SAPI=='cli'){
//guess_the_number(1);
guess_the_number2();
}else{
echo'Pleaserunundercommandline!';
exit;
}
② Php 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程序
利用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:xamppphp在dos命令在可以這個執行:
復制代碼 代碼如下:D:xamppphpphp.exe D:xampphtdocstest.php
就可以執行test.php這個文件了 。這里推薦win平台下xampp集成環境,真正比wamp強大N倍,這個集成包可以直接進入dos模式。
linux下php_cli使用
首先找到你安裝php的路徑,以我為例:
當然實現的方法不止一個,大家可以嘗試其他方法實現!
例外關於php的cli還有很多參數可以加入:具體可以參考:http://php.net/manual/en/features.commandline.php
關於定時執行
cron是一個linux下的定時執行工具,可以在無需人工干預的情況下運行作業,周期性作業,比如備份數據 打開/etc/crontab,添加:
復制代碼 代碼如下:
/usr/bin/php -f /data/htdocs/test.php
③ PHP里的output_buffering 怎麼開啟
在PHP.INI可以設置以下與輸出緩沖有關的:
名稱 默認值 作用范圍 修正記錄
output_buffering "0" PHP_INI_PERDIR
output_handler NULL PHP_INI_PERDIR 自 PHP 4.0.4 起可用
implicit_flush "0" PHP_INI_ALL 在 PHP <= 4.2.3 版本中是 PHP_INI_PERDIR
簡單解釋如下:
output_buffering boolean/integer
該選項設置為 On 時,將在所有的腳本中使用輸出控制。如果要限制輸出緩沖區的最大值,可將該選項設定為指定的最大位元組數(例如 output_buffering=4096)。從PHP 4.3.5 版開始,該選項在 PHP-CLI 下總是為 Off。
output_handler string
該選項可將腳本所有的輸出,重定向到一個函數。例如,將 output_handler 設置為 mb_output_handler() 時,字元的編碼將被修改為指定的編碼。設置的任何處理函數,將自動的處理輸出緩沖。
注意: 不能同時使用 mb_output_handler() 和 ob_iconv_handler(),也不能同時使用 ob_gzhandler() 和 zlib.output_compression。
注意: 只有內置函數可以使用此指令。對於用戶定義的函數,使用 ob_start()。
implicit_flush boolean
默認為 FALSE。如將該選項改為 TRUE,PHP 將使輸出層,在每段信息塊輸出後,自動刷新。這等同於在每次使用 print()、echo() 等函數或每個 HTML 塊之後,調用 PHP 中的 flush() 函數。
不在web環境中使用 PHP 時,打開這個選項對程序執行的性能有嚴重的影響,通常只推薦在調試時使用。在 CLI SAPI 的執行模式下,該標記默認為 TRUE。
參見 ob_implicit_flush()。
設置了肯定會有用的,除非你修改的PHP.INI位置不是系統使用的那個,比如一般是C::\WINDOWS\PHP.INI,當然可以設置到其它地方。另外控制台程序是不緩沖的。
另外,你還可以在程序裡面控制輸出緩沖,請參考手冊裡面的「CXIV. Output Control 輸出控制函數」那一章,主要有如下函數:
flush -- 刷新輸出緩沖
ob_clean -- Clean (erase) the output buffer
ob_end_clean -- Clean (erase) the output buffer and turn off output buffering
ob_end_flush -- Flush (send) the output buffer and turn off output buffering
ob_flush -- Flush (send) the output buffer
ob_get_clean -- Get current buffer contents and delete current output buffer
ob_get_contents -- Return the contents of the output buffer
ob_get_flush -- Flush the output buffer, return it as a string and turn off output buffering
ob_get_length -- Return the length of the output buffer
ob_get_level -- Return the nesting level of the output buffering mechanism
ob_get_status -- Get status of output buffers
ob_gzhandler -- ob_start callback function to gzip output buffer
ob_implicit_flush -- Turn implicit flush on/off
ob_list_handlers -- List all output handlers in use
ob_start -- Turn on output buffering
output_add_rewrite_var -- Add URL rewriter values
output_reset_rewrite_vars -- Reset URL rewriter values
例子程序:
<?php
ob_start();
echo "Hello\n";
setcookie("cookiename", "cookiedata");
ob_end_flush();
?>
④ 編譯php時make ZEND_EXTRA_LIBS='-liconv'這句命令中ZEND_EXTRA_LIBS='-liconv'起什麼作用呢
如果不加make ZEND_EXTRA_LIBS='-liconv' ,在編譯php的時候,config可能沒有問題,但在make的時候可能出現undefined reference to `libiconv_open'
collect2: ld returned 1 exit status
make: *** [sapi/cli/php] Error 1
所以為了解決這個問題,需要使用make ZEND_EXTRA_LIBS='-liconv'