如何在linux伺服器上用 PHP 執行 python 腳本?
主要是想執行下面三條命令條
爬蟲
"sudo nohup python /home/ec2-user/edm/edm/get_email.py &>/var/www/html/getemail.txt "
"sudo nohup python /home/ec2-user/edm/edm/get_domain.py &>/var/www/html/getdomain.txt "這條是郵件發送的命令
"nohup python /home/ec2-user/edm/edm/send_email.py &>/var/www/html/send_email.txt"
這問題不會讓PHP程序員跟Python程序員打起來吧……
PHP程序員:幹嘛不用PHP寫腳本?
Python程序員:你居然還用PHP寫網站?
當然更一般來說,優化一下結構,把外部調用改寫成內部調用的確是有好處的,比如把PHP用Python重寫了
shell_exec
不建議這樣做。
通常以 PHP-FPM 模式運行的 PHP 程序,其生命周期最多只有幾十秒,不適合再去起一個進程。
建議:
如果爬蟲邏輯簡單,可以用 PHP 重寫。
如果爬蟲邏輯複雜,可以用 Kafka 之類的消息隊列解耦。
做一個 rpc 啊。不過有點複雜。
如果簡單的調用的話用 進程守護也可以。
雖然覺得不好意思,但這事我干過。。。。shell_exec, exec, passthru 都可以,但是注意路徑問題,要麼全寫絕對路徑,要麼設定好PATH,不然會出現各種各樣奇怪的問題。。。
當時是給部門寫一個識別教務系統驗證碼的介面,用python寫,趕著上線就用php包裝了一下扔上了伺服器,用的是passthru
但是說實話,這樣做感覺蠢爆了。。。如果題主是以cli模式運行還好,fpm有個問題是有個多長時間沒有反饋就終止的設定,雖然識別時間壓到了0.4s,還是有很多請求就這樣掛掉了,請題主三思。。。
綜上所述,如果題主有python開發經驗,建議全部用python完成;如果非要用其他腳本執行,建議用nodejs,畢竟非同步,沒記錯也是exec函數;如果有php框架例如Laravel,可以用queue來調用,也是偽非同步的ˊ_&>ˋshell_exec
雖然不了解具體環境,但總覺得使用這麼奇葩方式的題主一定是有故事的人。不然用PHP直接讀文件發郵件,又或者curl或用Guzzle之類的庫來調Python寫的API不是更安全更方便?
supervisor
php調用shell shell調用python
直接搜xxx執行shell命令
關鍵詞: shell_exec ,php安全模式
我就是題主, 目前問題已經解決。 其實是花了一百多塊錢在淘寶找人幫忙處理的。運行環境的 centos 加apache。 一開始我也是開啟了PHP 的安全模式, 用shell_exec 和 system 命令, 後來發現行不通。 淘寶賣家看了我的代碼之後, 發現是執行許可權問題, 把python 代碼轉移的 apache web 根目錄之後就可以正常運行了。 但是之後發現這樣子運行之後導致發送郵件的成功率很低, 然後我又把發送的腳本直接丟到郵局伺服器上去運行。 還是通過上述方法用php 執行, 發現python 腳本只執行了一部分代碼就死掉了,然後我去淘寶找人, 那老闆直接幫我 修改了 senlinux 文件,然後執行getfore, setfore 0, 兩條命令, 膽碼執行正確, 郵件發送的成功率也上來了。
其實我也想通過python 或者php 一種語言完成, 奈何php 寫爬蟲功能很不完善,代碼解析功能弱, 關鍵爬取谷歌回來的代碼是經過加密,之前寫好了php 爬蟲之後不得不放棄,改用python, python 的爬蟲功能比php 強大得多。 但是網頁必須得用php 寫,框架我只熟悉 Thinkphp. 而且我不也會用python寫網頁。
半桶水的程序員只能用這種粗暴的方法去解決問題, 讓大家見笑了。
推薦閱讀:
※linux下配的ftp伺服器埠僅僅開21,20埠還不夠?
※在Windows中,選擇TCP/IPv4協議設置中的」自動獲取DNS伺服器地址「,計算機究竟做了什麼?
※中國能否在未來擁有根伺服器?
※免費dns伺服器8.8.8.8 接收全世界這麼多請求,這台伺服器性能得多高啊,怎麼才能扛住這麼多請求?
※能否寫一個socket程序,連上QQ伺服器?