大家好,今天給各位分享銷毀圖像的php函數的一些知識,其中也會對php關于包含文件的說法正確的是進行解釋,文章篇幅可能偏長,如果能碰巧解決你現在面臨的問題,別忘了關注本站,現在就馬上開始吧!
如何部署pythonweb程序
PythonWeb程序的部署方案
綜合而言,高性能的Pythonweb站點部署方式首推nginx+uwsgi
apache+mod_wsgi是簡單穩定但性能一般的方式
API服務器可以直接使用tornado或者gevent
mod_python
非常原始的cgi模式部署python已經沒有什么好介紹了。對于不太追求性能的管理系統和網站來說,使用Apache部署是一個不錯的選擇。較早的時候,使用mode_python部署python的web應用十分流行,在Django0.96的時候官方文檔甚至推薦這種方式。
它將Python解釋器嵌入到Apacheserver,以提供一個訪問Apacheserver內部的接口。mod_python在現在看來性能是不佳的,每一個http請求mod_python都會由一個進程初始化python解釋器、載入代碼、執行、然后銷毀進程。
mod_wsgi
如果非要用Apache來部署python應用,mod_wsgi是一個更好的選擇。WSGI全稱是WebServerGatewayInterface,由PEP-333定義。基本上所有的pythonweb框架都實現了wsgi接口,用mod_wsgi能部署任何實現了wsgi的框架。實際上,不需要任何框架也可以用mod_wsgi部署python程序。使用mod_wsgi的daemon模式,python程序會常駐內存,不會有很大的初始化和銷毀進程方面的開銷,所以性能是好于mod_python的。綜合來說,使用Apache部署pythonweb程序,推薦使用mod_wsgi的daemon模式。
Fastcgi
先說觀點:不建議用fastcgi的方式部署Pythonweb。
前幾年由于lighttpd風頭正勁和豆瓣的成功案例,fastcgi是一種很流行的部署方式。fastcgi與具體語言無關,也與web服務器無關。是一種通用的部署方式。fastcgi是對于cgi的增強,CGI程序運行在獨立的進程中,并對每個Web請求建立一個進程。面對大量請求,進程的大量建立和消亡使操作系統性能大大下降。
與為每個請求創建一個新的進程不同,FastCGI使用持續的進程來處理一連串的請求。這些進程由FastCGI服務器管理,而不是web服務器。當進來一個請求時,web服務器把環境變量和這個頁面請求通過一個socket比如FastCGI進程與web服務器都位于本地)或者一個TCPconnection(FastCGI進程在遠端的serverfarm)傳遞給FastCGI進程。
主流的web服務器,Apache,lighttpd,nginx都支持fastcgi,在幾年前,lighttpd的mod_fcgi模塊性能強勁,lighttpd+fastcgi十分流行。無論是python,ruby還是php,都有大量的站點使用這種方式部署。由于nginx的崛起,現在很少有人使用lighttpd了。
fastcgi并不是專門為python設計,并不是所有的python框架天然的支持fastcgi,通常需要flup這樣的容器來配適。flup由python編寫,和專門的c實現的wsgi容器比起來性能顯得相當不堪。fastcgi的穩定性對于新興的wsgi容器來說也有差距。無論從哪個方面來看,部署pythonweb程序,fastcgi都已經是過去式。
uwsgi
前幾年nginx還未內置uwsgi模塊的時候,部署uwsgi還是一件挺麻煩的事情。隨著能夠在nginx中直接使用uwsgi模塊,uwsgi已經是最可靠,最方便的高性能pythonweb程序的部署方式了。
在1U的四核XEON服務器上,一個簡單的wsgihandler甚至能用AB壓到8000以上的qps,這已經是完爆tornado,接近gevent的性能了。同時,uwsgi的穩定性極好。之前我們有個每天500w-1000w動態請求的站點使用uwsgi部署非常穩定,在一個渣HP1U服務器上,基本不用管它。
上面提到的部署方式都是相對于web網站的方式,在移動互聯網的時代,我們需要的是高性能的API服務,上面這些都是過時的東西。
tornado
tornado號稱高性能,如果拿他寫網站,其實一般般,只不過跟uwsgi加一些簡單框架差不多而已。它真正的作用,是用來寫API服務器和長連接的服務器。
由于tornado能夠直接處理http請求,很多人直接拿他來裸奔直接提供服務。這種方式是不可取的,單線程的tornado只能利用cpu的一個核心,并且一旦阻塞直接就廢了。通常情況下,由supervisor啟動多個tornado進程,通過nginx進行反向代理負載均衡。nginx1.14以后的版本反向代理支持長連接,配合tornado的comet效果很好。
tornado還有一些比較奇葩的用法,比如用來做wsgi容器之類的。
gevent
gevent是一個神器,能做的事情很多。在web方面,處理http請求,用起來其實跟tornado差不多,但是要簡陋很多,cookie之類的都沒有。用gevent寫的一些API服務,部署方式還是類似tornado,用supervisor管理多個守護進程,通過nginx做負載均衡。同樣的它的奇葩用法也和tornado一樣,可以當wsgi容器用。
函數參數的各種語法特征
一、函數的基本語法
語法
functionfunctionName(類型限定參數列表):返回值類型
{
}
案例:計算兩個數之和。
functionsum(int$a,int$b):string
{
return$a+$b;
}
echosum(1,2);//3
二、函數的分類
2.1命名函數
命名函數自動提升到腳本頂部,在全局任何地方都能調用。
//按函數名稱調用
demo1('殘破的蛋蛋');
//聲明一個demo1函數
functiondemo1($name){
echo"Mynameis${name}.";
}
以上代碼會輸出:Mynameis殘破的蛋蛋.
2.2匿名函數
沒有指定具體函數名稱的函數叫匿名函數,也叫閉包函數。
$var=function(){
//TODO
}
以上聲明的就是一個匿名函數,它需要把函數賦給一個變量,然后通過變量去調用。
$demo2=function(){
echo"HelloWorld!";
}
$demo2();//HelloWorld!
匿名函數通過變量調用,以上結果為:HelloWorld!。
三、函數的參數
3.1必選參數
functionperson1(string$name):string
{
return"Hello,${name}!";
}
echoperson1('殘破的蛋蛋')."<br>";//Hello,殘破的蛋蛋!
echoperson1(123)."<br>";//Hello,123!
echoperson1(true)."<br>";//報錯
上述第三次函數調用報錯的原因是:當限定了傳入的參數類型為字符串時,標量(單值)會自動轉換成字符串,但是布爾型、數組、類是無法自動轉換的。
3.2可選參數
在定義函數的時候聲明了參數,如果在調用的時候沒有指定參數或者是少指定了參數,那么就會出現缺少參數的報錯。在PHP中,支持函數的默認方式調用,即為函數的參數指定一個默認值,在調用函數的過程中如果沒有指定參數的值,那么在函數中會使用參數的默認值。
functionperson2(string$name,int$age=20,string$sex="男"){
echo"我的名字是:${name},年齡:${age}歲,性別:${sex}。<br>";
}
//我的名字是:殘破的蛋蛋,年齡:20歲,性別:男。
person2('殘破的蛋蛋');
在上述案例中我們確實為person2()函數聲明了三個參數,但是我們只傳了一個參數,其他兩個參數都使用的是默認值。當調用函數傳參的過程中,實參和形參是按照參數傳遞的順序一一對應的,如果實參個數少于形參,則后面的形參不會被傳值。當使用默認參數時,必須放在非默認參數的后面,否則可能會導致函數不會按照預期的執行。
3.3不定參數
語法
functionfunctionName(...$args){
//TODO
}
functionperson3(){
//獲取傳遞給函數的所有變量數組
$args=func_get_args();
//遍歷每一個傳入的參數
foreach($argsas$key=>$arg){
$num=$key+1;
echo"第${num}個參數是:${arg}<br>";
}
}
person3('殘破的蛋蛋',30,'男');
//第1個參數是:殘破的蛋蛋
//第2個參數是:30
//第3個參數是:男
從PHP5.6以后,可以不使用func_get_args()函數獲取可變參數,使用“…”運算符來實現可變長度的函數。
functionperson4(...$args){
print_r($args);
}
person4('殘破的蛋蛋',30,'男');//Array([0]=>殘破的蛋蛋[1]=>30[2]=>男)
這是一個非常實用的功能,當一個函數的參數過多時,可以不用逐一地傳遞參數,實用可變參數就可以傳參了。
四、函數的返回值
通常情況下,函數只允許有一個返回值,原則是“單值”返回的,如果想返回多值怎么辦?那么只能在返回值的類型上打主意了,可以通過以下方法來操作。
4.1返回一個數組
functionsuccess():array
{
return['status'=>1,'message'=>'驗證成功'];
}
$res=demo1();
echo$res['status']?$res['message']:'驗證失敗!';//驗證成功!
4.2返回一個對象
functionuser():object
{
returnnewclass(){
public$name='admin';
public$email='admin@abc.cn';
};
}
$user=user();
printf("name=%s,email=%s",$user->name,$user->email);//name=admin,email=admin@abc.cn
4.3序列化字符串
4.3.1php內置的序列化函數
如果有一些數據需要進行網絡傳輸或保存到文件或數據表中的時候要用到序列化函數。如果這個序列化的數據只在php程序中使用,應該使用php內置的方法就可以了。
functionresult():string
{
returnserialize(['status'=>1,'message'=>'驗證成功']);
}
echoresult();//a:2:{s:6:"status";i:1;s:7:"message";s:12:"驗證成功";}
在php中使用時要還原成原來的類型,也就說反序列化:
$arr=unserialize($str);
print_r($arr);//Array([status]=>1[message]=>驗證成功)
4.3.2JSON格式字符串
將數據轉為通用的JSON格式字符串,這樣的話就可以與其他語言進行數據交換了,例如:JS,JAVA…
functiondemo4():string
{
//JSON_UNESCAPED_UNICODE顯示中文,否則顯示的是編碼過的中文字符
//\u9a8c\u8bc1\u6210\u529f
returnjson_encode(['status'=>1,'message'=>'驗證成功'],JSON_UNESCAPED_UNICODE);
}
$str=demo4();
echo$str;//{"status":1,"message":"驗證成功"}
如果當前腳本接收到一個前端或其它接口發送過來的json格式的數據,可以使用json_decode進行解析。解析的目的是將外部的json還原成php能夠處理的數據類型。
$res=json_decode($str);
//默認將外部的JSON解析成Object類型。
var_dump($res);
printf('status=%d,message=%s<hr>',$res->status,$res->message);
結果:
如果不用對象的方式訪問,也可以給json_decode()函數傳入第二個參數:true。
$res=json_decode($str,true);
printf('status=%d,message=%s<hr>',$res['status'],$res['message']);
結果:
五、函數的作用域
在JS中作用域有三種:全局、函數、塊作用域,而在PHP中,只有全局和函數一種作用域。
全局變量也稱為外部變量,是定義在函數外部的。它的作用域從變量定義處開始。
$name='殘破的蛋蛋';//聲明一個$name的全局變量
$email='826350863@qq.com';//聲明一個$email的全局變量
//聲明一個user函數
functionuser(){
echo"我的名字是:${name},郵箱是:${email}";
}
//調用函數
user();
結果:
以上結果我們發現報錯了,這是因為在上面的代碼中,在函數user()外面聲明了兩個全局變量$name和$email,但是在PHP中,不能直接在函數中使用全局變量,所以在user()函數中使用的變量$name和$email相當于新聲明的兩個變量,并且沒有被賦值,是兩個空值,所以會報錯。
在函數中如果要使用全局變量可以使用global關鍵字或者$GLOBALS關鍵字。如下所示:
functionuser1(){
//在函數內部使用global關鍵字引入全局變量,多個變量之間用逗號隔開
global$name,$email;
echo"我的名字是:${name},郵箱是:${email}";
}
user1();//我的名字是:殘破的蛋蛋,郵箱是:826350863@qq.com
functionuser2(){
//在函數內部使用global關鍵字引入全局變量,多個變量之間用逗號隔開
echo"我的名字是:{$GLOBALS['name']},郵箱是:{$GLOBALS['email']}";
}
user2();
以上兩個函數user1()和user2()都可以正常的輸出結果:我的名字是:殘破的蛋蛋,郵箱是:826350863@qq.com。
在$GLOBALS數組中,每一個變量都是一個元素,變量名就是它的鍵名,變量值就是對應的鍵值。$GLOBALS是一個超全局變量。
六、閉包
匿名函數就是閉包(官方手冊寫的),閉包可以訪問函數外部的自由變量/父級作用域的變量。
$demo2=function()use($name,$email){
returnsprintf('name=%s<br>email=%s',$name,$email);
};
echo$demo2();
結果
閉包支持引用傳參:參數前加&,示例如下:
echo"當前name的值是:${name}<br>";
$demo3=function($myName)use(&$name){
//閉包中將引用參數更新后,會實時映射到外部的原始參數中
$name=$myName;
echo"現在name的值是:${name}<br>";
};
echo$demo3('拤碎的蛋蛋');
//輸出:
//當前name的值是:殘破的蛋蛋
//現在name的值是:拤碎的蛋蛋
結果
閉包use禁止使用以下三種參數:
超全局不讓用$_GET
$this
與當前參數重名不讓用
閉包經常用作函數的返回值,示例如下:
//閉包經常用作函數的返回值
functiondemo4($site){
returnfunction($color)use($site){
returnsprintf('<h3>%s</h3>',$color,$site);
};
}
第一種調用方式:
var_dump(demo4('PHP中文網'));
$closure=demo4('PHP中文網');
echo$closure('red');
第二種調用方式:
//通過高階函數調用:柯里化
echodemo4('PHP中文網')('red');
結果:
七、回調函數
回調函數是指調用函數時傳遞的不是一個標準的變量,而是將另外一個函數作為參數傳遞到調用的函數中。
call_user_func_array()調用回調函數,并把一個數組作為回調函數的參數。
語法:
call_user_func_array(callable$callback,array$param_arr):mixed
案例
classPerson{
//實例方法
publicfunctiongetName(string$name):string
{
return"Mynameis${name},";
}
publicstaticfunctionage(int$age):string
{
return"年齡是:${age}歲。";
}
}
//調用實例方法
//注意,這里必須是要實例化的,除非是static
$str=call_user_func_array(['Person','getName'],['殘破的蛋蛋']);
//調用靜態方法
$str.=call_user_func_array(['Person','age'],[18]);
//下面的用法跟上面相同
//$str.=call_user_func_array('Person::age',[18]);
echo$str;//Mynameis殘破的蛋蛋,年齡是:18歲。
八、靜態變量
通常函數中的變量隨著函數的調用結束就會自動銷毀了,通過下面的案例我們可以得出這個結論:
functiondemo1(){
$i=1;
echo"$i<br>";
$i++;
}
demo1();//1
demo1();//1
demo1();//1
demo1();//1
以上代碼,無論調用多少次demo1()函數結果都是輸出1,說明在第2、3、4次調用函數中并沒有執行到$i++,每次函數調用都是從$i=1開始的。
如果我們想要讓結果保留到下次調用,那么就需要使用到靜態變量了,示例如下:
functiondemo2(){
static$i=1;
echo"$i<br>";
$i++;
}
demo2();//1
demo2();//2
demo2();//3
demo2();//4
以上結果分別輸出了1、2、3、4,說明函數中的靜態變量不會隨函數調用結束而消失,而是進入到了下一次的函數調用中,這種場景可以應用在函數的多次調用中的數據共享/數據通信。
pbo怎么關
PBO(PixelBufferObject)是一種用于高效地進行像素數據傳輸的OpenGL擴展。
關于如何關閉PBO,這里要先明確一個情境。
如果你正在使用某個程序或者編寫代碼中涉及到PBO,并且想要停止使用或禁用它,以下是可能的解釋和延伸內容:1.根據不同的上下文和環境,關閉PBO的方式可能會有所不同。
一種常見的方式是在程序中的相關設置或選項中禁用PBO的使用。
2.若要在代碼中禁用PBO,你可以在相應的函數調用之前將PBO的ID或綁定點設為0。
這個操作通常被認為是解除綁定的標志。
3.注意,關閉或禁用PBO可能會對性能和功能產生影響。
在某些情況下,PBO可以提供更快的數據傳輸和處理速度。
因此,在決定關閉或禁用PBO之前,你可能需要評估相關的性能和需求。
所以,具體關閉PBO的方法取決于你所使用的環境和代碼實現細節。
在相應的上下文中,你可以執行適當的操作以停止使用或禁用PBO。
好了,文章到這里就結束啦,如果本次分享的銷毀圖像的php函數和php關于包含文件的說法正確的是問題對您有所幫助,還望關注下本站哦!