Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
起因:因?yàn)楣居龅桨l(fā)稿問(wèn)題,很多人喜歡用word編碼,然后再發(fā)布到網(wǎng)站上。PHP的包中雖然有部分可以使用的類庫(kù),但是對(duì)于圖片始終處理不好,我就想到了python。研究了下,python將word轉(zhuǎn)為html還真是方便。但是,怎么結(jié)合到服務(wù)器上呢?我們的服務(wù)器是用PHP開發(fā)的。
1:python腳本
#!/usr/bin/python# -*- coding: UTF-8 -*-import sysfrom pydocx import PyDocXreload(sys)sys.setdefaultencoding('utf8')FileName = sys.argv[1] #獲取文件名參數(shù)ShortName = sys.argv[2] #獲取文件名參數(shù)html = PyDocX.to_html(FileName) # f = open("/www/wwwroot/micuer.com/pythoncode/runtime/99.txt", 'w') #服務(wù)器的全路徑# f.write(html)# f.close()print(html)
2:php處理腳本
public function uploadword(){ try { $file = request()->file("file"); // 上傳到本地服務(wù)器 $savename = \think\facade\Filesystem::disk('upload')->putFile( 'word', $file); $shotrname = time().".txt"; // 短名稱 $savename = "/www/wwwroot/micuer.com/data/upload/".$savename; //Request::domain(). $python_file_name = "/www/wwwroot/micuer.com/pythoncode/WordToHtml.py"; //組裝命令 $cmd = "python {$python_file_name} ".$savename." {$shotrname} 2>error.txt 2>&1"; $res = exec($cmd,$array, $ret); return json(["code"=>200,"msg"=>"成功","data"=>$savename,"cmd"=>$cmd,"array"=>$array]); } catch (think\exception\ValidateException $e) { return json(["code"=>40000,"msg"=>$e->getMessage()]); } }
上傳界面如下:
實(shí)現(xiàn)的功能就是利用PHP的exec函數(shù),調(diào)用py腳本,將html代碼返回給前臺(tái)服務(wù)器。
返回?cái)?shù)據(jù)如下
其實(shí),再處理這個(gè)方案中,也遇到了很多問(wèn)題,比如在命令行下只能成功,但是exec函數(shù)執(zhí)行不成功等等。
參考了資料:https://my.oschina.net/u/4427610/blog/3155816
也就是
exec("python python_test.py 2>error.txt 2>&1", $array, $ret);
在bash中0,1,2三個(gè)數(shù)字分代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即標(biāo)準(zhǔn)輸入(一般是鍵盤),標(biāo)準(zhǔn)輸出(一般是顯示屏,準(zhǔn)確的說(shuō)是用戶終端控制臺(tái)),標(biāo)準(zhǔn)錯(cuò)誤(出錯(cuò)信息輸出)。
也可以通過(guò)以下方式將標(biāo)準(zhǔn)錯(cuò)誤重定向到標(biāo)準(zhǔn)輸出保存到$array中:
打印之后,發(fā)現(xiàn)是沒有權(quán)限調(diào)用。于是就直接改為輸出了,也就是 py的print(html)函數(shù)。
注意幾點(diǎn):
1:執(zhí)行權(quán)限問(wèn)題
2:exec(“python python_test.py 2>error.txt 2>&1”, $array, $ret); 中 $array就接受到了 print(html)的值
3:各個(gè)腳本盡量使用全路徑
頭條創(chuàng)作挑戰(zhàn)賽#
本文同步本人掘金平臺(tái)的原創(chuàng)翻譯:https://juejin.cn/post/6844904025305923592
在上網(wǎng)的時(shí)候,收到任何的錯(cuò)誤碼都是讓人沮喪的體驗(yàn)。盡管我們已經(jīng)習(xí)慣于404頁(yè)面找不到,我們?cè)陧?yè)面迷失的時(shí)候,看到可愛的占位符來(lái)娛樂(lè)我們是很常見的事情了。但是有種更令人困惑的403錯(cuò)誤:禁止響應(yīng)。
簡(jiǎn)單來(lái)說(shuō):當(dāng)你發(fā)起請(qǐng)求的時(shí)候,服務(wù)端決定了你沒有權(quán)限訪問(wèn)。
根據(jù)RFC 7231:
403(禁止)狀態(tài)碼表明服務(wù)端已經(jīng)明白請(qǐng)求,但是拒絕授權(quán)...如果請(qǐng)求中提供了授權(quán)的身份認(rèn)證,服務(wù)端認(rèn)為它們不足以授予訪問(wèn)權(quán)限。
403響應(yīng)是屬于客戶端錯(cuò)誤4xx范圍的HTTP響應(yīng)。這意味著你或者你的瀏覽器做錯(cuò)了什么。
如果你遇到這個(gè),這通常意味著你已經(jīng)通過(guò)服務(wù)器進(jìn)行了身份驗(yàn)證,比如你已經(jīng)登陸,但是你請(qǐng)求的資源希望某人具有更高的特權(quán)。
最常見的,你作為一個(gè)普通用戶登陸系統(tǒng),但是你嘗試去獲取管理員(權(quán)限的)頁(yè)面。
作為一個(gè)沒有訪問(wèn)服務(wù)器權(quán)限的用戶,你實(shí)際上只有幾種選擇:
再者,根據(jù)RFC 7231
如果請(qǐng)求中提供了身份驗(yàn)證憑據(jù),則服務(wù)器認(rèn)為它們不足以授予訪問(wèn)權(quán)限。客戶端不應(yīng)該使用相同的憑證重復(fù)請(qǐng)求。客戶端可以用新的或不同證書重復(fù)請(qǐng)求。
這是唯一使你立刻擁有解決此問(wèn)題能力的解決方案。
如果你在一個(gè)站點(diǎn)上擁有多個(gè)賬號(hào),并且嘗試執(zhí)行通常可以訪問(wèn)的操作,但是這次被禁止這樣做了,那么你應(yīng)該嘗試此方法:使用你的其他賬號(hào)登陸。
你可能會(huì)發(fā)現(xiàn),此選項(xiàng)還需要清除緩存或Cookies,以防萬(wàn)一其他用戶登陸而導(dǎo)致刷新身份驗(yàn)證令牌失效。但是通常是不需要的操作。
作為一個(gè)令人絕望的舉動(dòng),你還可以嘗試禁止可能會(huì)干擾你使用網(wǎng)站的瀏覽器擴(kuò)展插件。但是,這不太可能,因?yàn)?03表明你已經(jīng)通過(guò)身份驗(yàn)證,但是未獲得授權(quán)。
譯者加:無(wú)法訪問(wèn)站點(diǎn),翻墻軟件也可能導(dǎo)致,請(qǐng)檢查是否關(guān)閉了代理軟件
如果你希望完全可以訪問(wèn)有問(wèn)題的資源,但是仍然看到此錯(cuò)誤,那么明智的做法就是讓網(wǎng)站背后的團(tuán)隊(duì)知道 - 這可能是他們的錯(cuò)誤。
再次引用RFC 7231:
然而,可能由于與憑證無(wú)關(guān)的原因而禁止請(qǐng)求。
造成這種情況意外發(fā)生的常見原因可能是服務(wù)器使用特定IP地址或地理區(qū)域允許列表或拒絕列表(名單)。
他們可能有充分的理由在嚴(yán)格定義的參數(shù)之外阻止你的訪問(wèn),但是也可能是一個(gè)疏忽。
也許你不應(yīng)該能夠訪問(wèn)該資源。這種情況是會(huì)有的。這是一個(gè)龐大的互聯(lián)網(wǎng),可以合理地預(yù)期某些區(qū)域?qū)δ惚救耸菬o(wú)法進(jìn)入的。
你可以通過(guò)http.cat站點(diǎn)來(lái)反省一下,為什么你的原始請(qǐng)求會(huì)被禁止
.函數(shù)的返回值
4.1return 語(yǔ)句
有的時(shí)候,我們會(huì)希望函數(shù)將值返回給調(diào)用者,此時(shí)通過(guò)使用return語(yǔ)句就可以實(shí)現(xiàn)。
<script>
function getResult(){
return 666;
}
// getResult();
console.log(getResult());
</script>
利用函數(shù)求任意一個(gè)數(shù)組中的最大值
<script>
function getArrMax(arr){
var max = arr[0];
for(var i=1;i<=arr.length;i++){
if(arr[i]>max){
max=arr[i];
}
}
return max;
}
var re = getArrMax([5,2,99,101,167,77]);
console.log(re);
</script>
4.2return終止函數(shù)
注意事項(xiàng):
<script>
//1.return終值函數(shù)
function getSum(num1,num2){
return num1 + num2; //return 后面的代碼不會(huì)被執(zhí)行
alert('我不會(huì)被執(zhí)行')
}
console.log(getSum(1,2));
//2.return 只能返回一個(gè)值
function fn(num1,num2){
return num1,num2; //返回的結(jié)果最后一個(gè)值
}
console.log(fn(1,2));
//3.我們求任意兩個(gè)數(shù)的 加減乘除結(jié)果
function getResule(num1,num2){
return [num1+num2,num1-num2,num*num2,num1/num2];
}
var re =getResule(1,2); //返回的是一個(gè)數(shù)組
console.log(re);
</script>
4.4函數(shù)沒有return返回undefined
4.5 break,continue,return的區(qū)別
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。