在PHP中,我們有一個(gè)非常好用的函數(shù),那便是expect函數(shù)。它的用途是等待一個(gè)命令行工具輸出一定的內(nèi)容。當(dāng)這個(gè)內(nèi)容被輸出后,expect就會(huì)把這些內(nèi)容捕獲并返回給我們使用。下面我們來(lái)看幾個(gè)具體的例子。
//例如,我們想要等待字幕文件制作工具中的“Complete!”輸出,那么我們可以寫如下代碼: $expect_script = 'expect "Complete!"'; $output = shell_exec("echo '{$expect_script}' | expect"); //接下來(lái)我們便可以對(duì)$output變量進(jìn)行操作了。
需要注意的是,在expect函數(shù)中我們可以使用特殊的通配符來(lái)匹配一定范圍內(nèi)的字符。這樣我們就可以在輸出的內(nèi)容中獲取我們想要的信息,并加以利用。下面我們來(lái)看一個(gè)例子:
//例如,我們想要獲取一個(gè)Unix用戶密碼,那么就可以寫成如下的代碼: $username = 'username'; $password = 'password'; $expect_script = "expect \"*assword:\" \n"; $expect_script .= "send \"$password\\r\" \n"; $output = shell_exec("echo '{$expect_script}' | sudo -u {$username} bash -c 'expect -'"); //通過(guò)通配符'*assword:'我們匹配了輸出中“Password:”后面的字符,從而得到了需要的信息。
除此之外,我們?cè)谑褂胑xpect函數(shù)的時(shí)候還要注意一些細(xì)節(jié)問(wèn)題。例如,我們需要將expect腳本寫入文件中,然后再進(jìn)行調(diào)用。這樣會(huì)更加方便我們對(duì)腳本進(jìn)行調(diào)試和修改。
//我們將expect腳本寫入文件,并使用shell_exec函數(shù)來(lái)運(yùn)行這個(gè)腳本: $expect_script_file = 'path/to/scriptfile'; file_put_contents($expect_script_file, $expect_script); $output = shell_exec("expect {$expect_script_file}"); //這樣我們就能得到和之前一樣的運(yùn)行結(jié)果,只不過(guò)這一次我們是調(diào)用了腳本文件。
另外,我們還可以使用expect函數(shù)來(lái)在程序中模擬用戶的操作。例如,我們想要登陸FTP服務(wù)器并進(jìn)行一些操作,那么我們可以寫成如下的代碼:
//我們可以通過(guò)expect函數(shù)來(lái)自動(dòng)切換到FTP服務(wù)器,并輸入用戶名和密碼進(jìn)行登陸。 $ftp_address = '127.0.0.1'; $ftp_username = 'username'; $ftp_password = 'password'; $expect_script = "spawn ftp {$ftp_address} \n"; $expect_script .= "expect \"Name (*):\" \n"; $expect_script .= "send \"$ftp_username\\r\" \n"; $expect_script .= "expect \"Password:\" \n"; $expect_script .= "send \"$ftp_password\\r\" \n"; $expect_script .= "interact \n"; //接下來(lái),我們只需要調(diào)用這個(gè)expect腳本即可自動(dòng)登陸FTP服務(wù)器并進(jìn)行操作。 $output = shell_exec("echo '{$expect_script}' | expect");
總的來(lái)說(shuō),expect函數(shù)是PHP中非常強(qiáng)大的一個(gè)函數(shù)。我們可以通過(guò)它來(lái)獲取和捕獲命令行工具的輸出信息,并將其加以利用。這個(gè)函數(shù)經(jīng)常用來(lái)對(duì)那些需要模擬用戶操作的命令行工具進(jìn)行封裝和調(diào)用。通過(guò)合理使用expect函數(shù),我們可以大大提高我們的工作效率,減少人力和時(shí)間的浪費(fèi)。