php命令列程式編寫範例

來源:互聯網
上載者:User
 

命令列下有兩個常量,STDOUT和STDIN分別代表標準輸出和標準輸入,通過它們來實現命令列的互動。 #!/usr/bin/php -q<?php/** * php命令列的編寫介紹 * @author Rains rains31@gmail.com * @copyright http://rains.cn *///怎麼判斷程式是否是以命令列的方式啟動並執行呢?//最簡單的方式就是:命令列程式中$_SERVER['REQUEST_METHOD']為空白。//web請求的話,一般是用post或get方法,而命令列不存在要求方法。define('USER_DIR','./data');if(empty($_SERVER['REQUEST_METHOD'])){//獲得命令列參數,是一個數組    $args = $_SERVER['argv'];    if(isset($_SERVER['_']) && basename($_SERVER['_'])!='php')    {$cmd = $_SERVER['_'];    }    else     {        $cmd = 'php '.array_shift($args);    }    /**     * 擷取選項參數     */    $option = array_shift($args);    switch($option)    {case '':case '-h':case '--help':    $msg .= "Usage:\t$cmd option [id]\r\n\tAvailable options:\r\n";    $msg .= "\t-h \tShow this help.\r\n";    $msg .= "\t-a\tAdd User\r\n";    $msg .= "\t-d name\tDelete User\r\n";    $msg .= "\t-p name\tModify password\r\n";    $msg .= "\t-l\tList all users.\r\n";break;case '-a':$name = read_name();$pass = read_pass();$msg = save_user(array('name'=>$name,'pass'=>$pass));break;case '-d':$name = array_shift($args);$msg = del_user($name);break;case '-p':$name = array_shift($args);$msg = modify_user($name);break;case '-l':$files = glob(USER_DIR.'/*.dat');foreach ($files as $file){$msg .= basename($file,'.dat')."\r\n";}$msg .= count($files)." user(s)\r\n";break;default:    $msg = "Invalid option '$option', please try '-h' for instructions.\r\n";break;    }    fwrite(STDOUT,$msg);    exit;}function read_name(){$msg = 'Plese input your prefered name(1-16 chars, 0-9 a-z A-Z _ and - ):';fwrite(STDOUT,$msg);while(preg_match('/^[-_0-9a-zA-Z]{1,16}$/',($name = trim(fgets(STDIN,16))),$matches)==false){fwrite(STDOUT,"Invalid name!\r\n".$msg);}return trim($name); }function read_pass(){$msg = "Please set your password(1-16 chars):";fwrite(STDOUT,$msg);while(($pass = trim(fgets(STDIN,16)))==''){fwrite(STDOUT,"Invalid password!\r\n".$msg);}return trim($pass);}function save_user($param=array()){if($param['name']=='' || $param['pass']==''){$msg = 'User name or password is empty!';}$user_data = USER_DIR.'/'.$param['name'].'.dat';if(file_exists($user_data)){$msg = "Sorry, user {$param['name']} already exists!";}else {$fp = fopen($user_data,'w');if(!$fp){$msg = "Sorry, some error occurred while writing user data.";}else {if(fwrite($fp,md5($param['pass']))){$msg = "Congratulations! User {$param['name']} has been accepted.";}else {$msg = "Sorry, some error occurred while writing user data.";}}fclose($fp);}return $msg;}function del_user($name){if(!preg_match('/^[-_0-9a-zA-Z]{1,16}$/',$name,$matches)){return 'invalid user name '.$name;}$user_data = USER_DIR.'/'.$name.'.dat';if(!file_exists($user_data)){return "Sorry, user {$name} doesn't exist!";}else {$msg = "Are you sure to delete user $name? press y to confirm or any other key to cancel:";if(confirm($msg)!='y'){return "Canceled!\r\n";}}if(unlink($user_data)){return "user $name has been successfully deleted!";}else {return "delete failed!";}}function confirm($msg = ''){fwrite(STDOUT,$msg);return fgetc(STDIN);}function modify_user($name){$user_data = USER_DIR.'/'.$name.'.dat';if(!file_exists($user_data)){return "Sorry, user {$name} doesn't exist!";}$msg = "Please enter OLD password(1-16 chars):";fwrite(STDOUT,$msg);while(($pass = trim(fgets(STDIN,16)))==''){fwrite(STDOUT,"Invalid password!\r\n".$msg);}$fp = fopen($user_data,'r+');if(!$fp){return "Sorry, some error occurred while reading user data.";}else {$old_pass = fread($fp,32);if(md5($pass)!=$old_pass){return "Old password $old_pass!=$pass doesn't match";}$msg = "Please enter NEW password(1-16 chars):";fwrite(STDOUT,$msg);while(($pass = trim(fgets(STDIN,16)))==''){fwrite(STDOUT,"Invalid password!\r\n".$msg);}rewind($fp);if(fwrite($fp,md5($pass))){$msg = "New password accepted!"; }else {$msg = "Sorry, some error occurred while writing user data.";}fclose($fp);}return $msg;}>後面還可以繼續實現WEB下面的功能。不過,沒必要讓兩個功能共用一個檔案。命令列啟動並執行東西。最好放在web目錄之外,以免由於配置錯誤,泄漏機密。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.