現代php
⑴ 大型的 php應用 通常使用什麼應用做 消息隊列 的
一、消息隊列概述
消息隊列中間件是分布式系統中重要的組件,主要解決應用耦合,非同步消息,流量削鋒等問題。實現高性能,高可用,可伸縮和最終一致性架構。是大型分布式系統不可缺少的中間件。
目前在生產環境,使用較多的消息隊列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。
二、消息隊列應用場景
以下介紹消息隊列在實際應用中常用的使用場景。非同步處理,應用解耦,流量削鋒和消息通訊四個場景。
2.1非同步處理
場景說明:用戶注冊後,需要發注冊郵件和注冊簡訊。傳統的做法有兩種1.串列的方式;2.並行方式。
(1)串列方式:將注冊信息寫入資料庫成功後,發送注冊郵件,再發送注冊簡訊。以上三個任務全部完成後,返回給客戶端。(架構KKQ:466097527,歡迎加入)
(2)並行方式:將注冊信息寫入資料庫成功後,發送注冊郵件的同時,發送注冊簡訊。以上三個任務完成後,返回給客戶端。與串列的差別是,並行的方式可以提高處理的時間。
假設三個業務節點每個使用50毫秒鍾,不考慮網路等其他開銷,則串列方式的時間是150毫秒,並行的時間可能是100毫秒。
因為CPU在單位時間內處理的請求數是一定的,假設CPU1秒內吞吐量是100次。則串列方式1秒內CPU可處理的請求量是7次(1000/150)。並行方式處理的請求量是10次(1000/100)。
小結:如以上案例描述,傳統的方式系統的性能(並發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?
引入消息隊列,將不是必須的業務邏輯,非同步處理。改造後的架構如下:
按照以上約定,用戶的響應時間相當於是注冊信息寫入資料庫的時間,也就是50毫秒。注冊郵件,發送簡訊寫入消息隊列後,直接返回,因此寫入消息隊列的速度很快,基本可以忽略,因此用戶的響應時間可能是50毫秒。因此架構改變後,系統的吞吐量提高到每秒20 QPS。比串列提高了3倍,比並行提高了兩倍。
2.2應用解耦
場景說明:用戶下單後,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的介面。如下圖:
傳統模式的缺點:
1) 假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗;
2) 訂單系統與庫存系統耦合;
如何解決以上問題呢?引入應用消息隊列後的方案,如下圖:
訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。
庫存系統:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作。
假如:在下單時庫存系統不能正常使用。也不影響正常下單,因為下單後,訂單系統寫入消息隊列就不再關心其他的後續操作了。實現訂單系統與庫存系統的應用解耦。
2.3流量削鋒
流量削鋒也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛。
應用場景:秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入消息隊列。
可以控制活動的人數;
可以緩解短時間內高流量壓垮應用;
用戶的請求,伺服器接收後,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面;
秒殺業務根據消息隊列中的請求信息,再做後續處理。
2.4日誌處理
日誌處理是指將消息隊列用在日誌處理中,比如Kafka的應用,解決大量日誌傳輸的問題。架構簡化如下:
日誌採集客戶端,負責日誌數據採集,定時寫受寫入Kafka隊列;
Kafka消息隊列,負責日誌數據的接收,存儲和轉發;
日誌處理應用:訂閱並消費kafka隊列中的日誌數據;
以下是新浪kafka日誌處理應用案例:
(1)Kafka:接收用戶日誌的消息隊列。
(2)Logstash:做日誌解析,統一成JSON輸出給Elasticsearch。
(3)Elasticsearch:實時日誌分析服務的核心技術,一個schemaless,實時的數據存儲服務,通過index組織數據,兼具強大的搜索和統計功能。
(4)Kibana:基於Elasticsearch的數據可視化組件,超強的數據可視化能力是眾多公司選擇ELK stack的重要原因。
2.5消息通訊
消息通訊是指,消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等。
點對點通訊:
客戶端A和客戶端B使用同一隊列,進行消息通訊。
聊天室通訊:
客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發布和接收。實現類似聊天室效果。
以上實際是消息隊列的兩種消息模式,點對點或發布訂閱模式。模型為示意圖,供參考。
三、消息中間件示例
3.1電商系統
消息隊列採用高可用,可持久化的消息中間件。比如Active MQ,Rabbit MQ,Rocket Mq。(1)應用將主幹邏輯處理完成後,寫入消息隊列。消息發送是否成功可以開啟消息的確認模式。(消息隊列返回消息接收成功狀態後,應用再返回,這樣保障消息的完整性)
(2)擴展流程(發簡訊,配送處理)訂閱隊列消息。採用推或拉的方式獲取消息並處理。
(3)消息將應用解耦的同時,帶來了數據一致性問題,可以採用最終一致性方式解決。比如主數據寫入資料庫,擴展應用根據消息隊列,並結合資料庫方式實現基於消息隊列的後續處理。
3.2日誌收集系統
分為Zookeeper注冊中心,日誌收集客戶端,Kafka集群和Storm集群(OtherApp)四部分組成。
Zookeeper注冊中心,提出負載均衡和地址查找服務;
日誌收集客戶端,用於採集應用系統的日誌,並將數據推送到kafka隊列;
四、JMS消息服務
講消息隊列就不得不提JMS 。JMS(java Message Service,Java消息服務)API是一個消息服務的標准/規范,允許應用程序組件基於JavaEE平台創建、發送、接收和讀取消息。它使分布式通信耦合度更低,消息服務更加可靠以及非同步性。
在EJB架構中,有消息bean可以無縫的與JM消息服務集成。在J2EE架構模式中,有消息服務者模式,用於實現消息與應用直接的解耦。
4.1消息模型
在JMS標准中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。
4.1.1 P2P模式
P2P模式包含三個角色:消息隊列(Queue),發送者(Sender),接收者(Receiver)。每個消息都被發送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留著消息,直到他們被消費或超時。
P2P的特點
每個消息只有一個消費者(Consumer)(即一旦被消費,消息就不再在消息隊列中)
發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息之後,不管接收者有沒有正在運行,它不會影響到消息被發送到隊列
接收者在成功接收消息之後需向隊列應答成功
如果希望發送的每個消息都會被成功處理的話,那麼需要P2P模式。(架構KKQ:466097527,歡迎加入)
4.1.2 Pub/sub模式
包含三個角色主題(Topic),發布者(Publisher),訂閱者(Subscriber) 。多個發布者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。
Pub/Sub的特點
每個消息可以有多個消費者
發布者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須創建一個訂閱者之後,才能消費發布者的消息。
為了消費消息,訂閱者必須保持運行的狀態。
為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息。
如果希望發送的消息可以不被做任何處理、或者只被一個消息者處理、或者可以被多個消費者處理的話,那麼可以採用Pub/Sub模型。
4.2消息消費
在JMS中,消息的產生和消費都是非同步的。對於消費來說,JMS的消息者可以通過兩種方式來消費消息。
(1)同步
訂閱者或接收者通過receive方法來接收消息,receive方法在接收到消息之前(或超時之前)將一直阻塞;
(2)非同步
訂閱者或接收者可以注冊為一個消息監聽器。當消息到達之後,系統自動調用監聽器的onMessage方法。
JNDI:Java命名和目錄介面,是一種標準的Java命名系統介面。可以在網路上查找和訪問服務。通過指定一個資源名稱,該名稱對應於資料庫或命名服務中的一個記錄,同時返回資源連接建立所必須的信息。
JNDI在JMS中起到查找和訪問發送目標或消息來源的作用。(架構KKQ:466097527,歡迎加入)
4.3JMS編程模型
(1) ConnectionFactory
創建Connection對象的工廠,針對兩種不同的jms消息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。可以通過JNDI來查找ConnectionFactory對象。
(2) Destination
Destination的意思是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來說,它的Destination是某個隊列(Queue)或某個主題(Topic);對於消息消費者來說,它的Destination也是某個隊列或主題(即消息來源)。
所以,Destination實際上就是兩種類型的對象:Queue、Topic可以通過JNDI來查找Destination。
(3) Connection
Connection表示在客戶端和JMS系統之間建立的鏈接(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection。
(4) Session
Session是操作消息的介面。可以通過session創建生產者、消費者、消息等。Session提供了事務的功能。當需要使用session發送/接收多個消息時,可以將這些發送/接收動作放到一個事務中。同樣,也分QueueSession和TopicSession。
(5) 消息的生產者
消息生產者由Session創建,並用於將消息發送到Destination。同樣,消息生產者分兩種類型:QueueSender和TopicPublisher。可以調用消息生產者的方法(send或publish方法)發送消息。
(6) 消息消費者
消息消費者由Session創建,用於接收被發送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來創建。當然,也可以session的creatDurableSubscriber方法來創建持久化的訂閱者。
(7) MessageListener
消息監聽器。如果注冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。
深入學習JMS對掌握JAVA架構,EJB架構有很好的幫助,消息中間件也是大型分布式系統必須的組件。本次分享主要做全局性介紹,具體的深入需要大家學習,實踐,總結,領會。
五、常用消息隊列
一般商用的容器,比如WebLogic,JBoss,都支持JMS標准,開發上很方便。但免費的比如Tomcat,Jetty等則需要使用第三方的消息中間件。本部分內容介紹常用的消息中間件(Active MQ,Rabbit MQ,Zero MQ,Kafka)以及他們的特點。
5.1 ActiveMQ
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息匯流排。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現,盡管JMS規范出台已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演著特殊的地位。
ActiveMQ特性如下:
⒈ 多種語言和協議編寫客戶端。語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
⒉ 完全支持JMS1.1和J2EE 1.4規范 (持久化,XA消息,事務)
⒊ 對spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統裡面去,而且也支持Spring2.0的特性
⒋ 通過了常見J2EE伺服器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業伺服器上
⒌ 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
⒍ 支持通過JDBC和journal提供高速的消息持久化
⒎ 從設計上保證了高性能的集群,客戶端-伺服器,點對點
⒏ 支持Ajax
⒐ 支持與Axis的整合
⒑ 可以很容易得調用內嵌JMS provider,進行測試
5.2 RabbitMQ
RabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQ是AMQP(高級消息隊列協議)的標准實現。支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX,持久化。用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。
幾個重要概念:
Broker:簡單來說就是消息隊列伺服器實體。
Exchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。
Queue:消息隊列載體,每個消息都會被投入到一個或多個隊列。
Binding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。
Routing Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。
vhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的許可權分離。
procer:消息生產者,就是投遞消息的程序。
consumer:消息消費者,就是接受消息的程序。
channel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務。
消息隊列的使用過程,如下:
(1)客戶端連接到消息隊列伺服器,打開一個channel。
(2)客戶端聲明一個exchange,並設置相關屬性。
(3)客戶端聲明一個queue,並設置相關屬性。
(4)客戶端使用routing key,在exchange和queue之間建立好綁定關系。
(5)客戶端投遞消息到exchange。
exchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列里。
5.3 ZeroMQ
號稱史上最快的消息隊列,它實際類似於Socket的一系列介面,他跟Socket的區別是:普通的socket是端到端的(1:1的關系),而ZMQ卻是可以N:M 的關系,人們對BSD套接字的了解較多的是點對點的連接,點對點連接需要顯式地建立連接、銷毀連接、選擇協議(TCP/UDP)和處理錯誤等,而ZMQ屏蔽了這些細節,讓你的網路編程更為簡單。ZMQ用於node與node間的通信,node可以是主機或者是進程。
引用官方的說法: 「ZMQ(以下ZeroMQ簡稱ZMQ)是一個簡單好用的傳輸層,像框架一樣的一個socket library,他使得Socket編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ的明確目標是「成為標准網路協議棧的一部分,之後進入Linux內核」。現在還未看到它們的成功。但是,它無疑是極具前景的、並且是人們更加需要的「傳統」BSD套接字之上的一 層封裝。ZMQ讓編寫高性能網路應用程序極為簡單和有趣。」
特點是:
高性能,非持久化;
跨平台:支持Linux、Windows、OS X等。
多語言支持; C、C++、Java、.NET、Python等30多種開發語言。
可單獨部署或集成到應用中使用;
可作為Socket通信庫使用。
與RabbitMQ相比,ZMQ並不像是一個傳統意義上的消息隊列伺服器,事實上,它也根本不是一個伺服器,更像一個底層的網路通訊庫,在Socket API之上做了一層封裝,將網路通訊、進程通訊和線程通訊抽象為統一的API介面。支持「Request-Reply 「,」Publisher-Subscriber「,」Parallel Pipeline」三種基本模型和擴展模型。
ZeroMQ高性能設計要點:
1、無鎖的隊列模型
對於跨線程間的交互(用戶端和session)之間的數據交換通道pipe,採用無鎖的隊列演算法CAS;在pipe兩端注冊有非同步事件,在讀或者寫消息到pipe的時,會自動觸發讀寫事件。
2、批量處理的演算法
對於傳統的消息處理,每個消息在發送和接收的時候,都需要系統的調用,這樣對於大量的消息,系統的開銷比較大,zeroMQ對於批量的消息,進行了適應性的優化,可以批量的接收和發送消息。
3、多核下的線程綁定,無須CPU切換
區別於傳統的多線程並發模式,信號量或者臨界區, zeroMQ充分利用多核的優勢,每個核綁定運行一個工作者線程,避免多線程之間的CPU切換開銷。
5.4 Kafka
Kafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者規模的網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網路上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的並行載入機制來統一線上和離線的消息處理,也是為了通過集群機來提供實時的消費。
Kafka是一種高吞吐量的分布式發布訂閱消息系統,有如下特性:
通過O(1)的磁碟數據結構提供消息的持久化,這種結構對於即使數以TB的消息存儲也能夠保持長時間的穩定性能。(文件追加的方式寫入數據,過期的數據定期刪除)
高吞吐量:即使是非常普通的硬體Kafka也可以支持每秒數百萬的消息。
支持通過Kafka伺服器和消費機集群來分區消息。
支持Hadoop並行數據載入。
Kafka相關概念
Broker
Kafka集群包含一個或多個伺服器,這種伺服器被稱為broker[5]
Topic
每條發布到Kafka集群的消息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存於一個或多個broker上但用戶只需指定消息的Topic即可生產或消費數據而不必關心數據存於何處)
Partition
Parition是物理上的概念,每個Topic包含一個或多個Partition.
Procer
負責發布消息到Kafka broker
Consumer
消息消費者,向Kafka broker讀取消息的客戶端。
Consumer Group
每個Consumer屬於一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group name則屬於默認的group)。
一般應用在大數據日誌處理或對實時性(少量延遲),可靠性(少量丟數據)要求稍低的場景使用。
⑵ 為什麼 Laravel 會成為最成功最流行的 PHP 框架
Laravel是一個有著美好前景的年輕框架,它的社區充滿著活力,同時提供了完整而清晰的文檔,而且為快速、安全地開發現代應用提供了必要的功能。
2011年,Taylor Otwell首次將Laravel帶給這個世界,彼時,Laravel就是一個全新且現代的框架。Laravel基於MVC架構,可以滿足諸如事件處理、用戶身份驗證等各種需求,同時通過包管理實現模塊化和可擴展的代碼,並且對資料庫管理有著健壯的支持。
不管是專家還是新手,一旦接觸到Laravel,都會有相見恨晚之感——這正是你在為PHP項目尋找的框架。本文我們將討論為什麼Laravel會成為最成功最流行的PHP框架。
模塊化&可擴展性
Laravel是模塊化和可擴展的,你可以在包含超過5500個程序包的Packalyst中找到你想要添加的任何代碼。
微服務&API
Lumen是一個由Laravel衍生的專注於性能的微框架。使用Lumen提供的高性能API你可以更加簡單快速地開發微型項目。Lumen使用最小的配置集成了Laravel的所有重要特性,你可以通過將代碼復制到Laravel項目來實現框架的完整遷移。
<?php
$app->get('/', function() {
return view('lumen');
});
$app->post('framework/{id}', function($framework) {
$this->dispatch(new Energy($framework));
});
HTTP路由
Laravel擁有類似於Ruby on Rails的快速高效的路由系統。它可以讓用戶通過在瀏覽器上輸入路徑的方式讓應用程序的各部分相關聯。
Route::get('/', function () {
return 'Hello World';
});
HTTP中間件
Route::get('/', function () {
return 'Hello World';
});
Laravel可以通過中間件對應用進行保護——中間件會處理分析和過濾到達伺服器的HTTP請求。你可以使用中間件來驗證注冊用戶、避免跨站腳本攻擊(XSS)以及其它安全問題。
<?php
namespace App\Http\Middleware;
use Closure;
class OldMiddleware {
public function handle($request, Closure $next) {
if ($request->input('age') <= 200) {
return redirect('home');
}
return $next($request);
}
}
緩存
Laravel提供了健壯的緩存系統,使用緩存可以讓應用載入地更加快速,從而帶來更好的用戶體驗。
Cache::extend('mongo', function($app) {
return Cache::repository(new MongoStore);
});
身份驗證
安全是至關重要的。Laravel自帶對本地用戶的身份驗證,並可以使用「remember」 選項來記住用戶。此外你還可以引入一些額外參數,例如是否是活躍用戶。
if (Auth::attempt(['email' => $email, 'password' => $password, 'active' => 1 ], $remember)) {
// The user is being remembered...
}
集成Stripe
Laravel Cashier可以滿足你開發支付系統過程中所需要的任何需求。除此之外,它還同步並集成了用戶身份驗證系統。所以,你不再需要擔心如何將計費系統集成到開發中了。
$user = User::find(1);
$user->subscription('monthly')->create($creditCardToken);
任務自動化
Elixir是一個讓我們可以使用Gulp定義任務的Laravel API,我們可以使用Elixir定義預處理器來壓縮CSS 和JavaScript。
elixir(function(mix) {
mix.browserify('main.js');
});
加密
一個安全的應用應該做到可以對數據進行加密。在Laravel中,可以使用OpenSSL和AES-256-CBC加密演算法來滿足你所有的加密需求。此外,所有的加密值都通過認證碼進行簽名以避免加密信息被篡改。
use Illuminate\Contracts\Encryption\DecryptException;
try {
$decrypted = Crypt::decrypt($encryptedValue);
} catch (DecryptException $e) {
//
}
事件處理
Laravel應用中對事件的定義、記錄和監聽都非常便捷。服務提供者EventServiceProvider中的listen屬性包含了應用中的所有事件列表。
protected $listen = [
'App\Events\PodcastWasPurchased' => [
'App\Listeners\EmailPurchaseConfirmation',
],
];
分頁
在Laravel中分頁非常簡單,因為它能夠根據用戶在瀏覽器中的當前頁生成一系列分頁鏈接。
<?php
namespace App\Http\Controllers;
use DB;
use App\Http\Controllers\Controller;
class UserController extends Controller {
public function index() {
$users = DB::table('users')->paginate(15);
return view('user.index', ['users' => $users]);
}
}
對象關系映射(ORM)
Laravel包含了一個資料庫處理層,其中的對象關系映射被稱作Eloquent。另外這個對象關系映射也適用於Postgresql。
$users = User::where('votes', '>', 100)->take(10)->get();
foreach ($users as $user) {
var_mp($user->name);
}
單元測試
單元測試的開發是一個耗費大量時間的任務,但是它卻保證了我們的應用能夠正常工作,不出問題。Laravel使用PHPUnit進行單元測試。
<?php
use Illuminate\Foundation\Testing\WithoutMiddleware;
use Illuminate\Foundation\Testing\DatabaseTransactions;
class ExampleTest extends TestCase {
public function testBasicExample() {
$this->visit('/')->see('Laravel 5')->dontSee('Rails');
}
}
待辦事項清單(Queue)
Laravel提供了在後台使用待辦事項清單(to do list)處理復雜、漫長流程的選擇,好吧,其實就是隊列,隊列可以讓我們非同步處理某些流程而不需要用戶在載入頁面時長時間的等待。
Queue::push ( new SendEmail ( $ message ));
⑶ php有什麼用處
php是後端語言,主要用於開發網站,如商城,bbs,國內大企的網站也脫離不了php,如微博,網路等等,我們使用它實現功能,這是一個過程,結果就是你看到了成千上萬的網站(當然有的並不是php寫的)
⑷ php的作用
PHP是一種簡單的,面向對象的,解釋型的,健壯的,安全的,性能非常之高的,獨立於架構的,可移植的,動態的腳本語言。PHP具有和JAVA類似的Class關鍵字。因為不需要虛擬機,以致速度比JAVA快5倍。PHP
正迅速變成一種標準的,多用途的,面向對象的腳本語言。PHP不僅可用來開發Web應用程序,也可以開發普通應用程序。
PHP是一種功能強大的腳本語言。PHP將擊敗PERL/Python並取而代之。PHP是下一代的PERL/Python腳本。PHP可以勝任任何PERL/Python做的工作,並且做的更多,更好,更簡潔!!
PHP是Hypertext
Pre-Processor(超文本預處理器)的縮寫,它是一種伺服器端的HTML腳本/編程語言。PHP語法上與C相似,可運行在Apache,
Netscape/iPlanet, 和 Microsoft IIS Web 伺服器上。PHP作為一種工具,
可以讓你創建動態的Web頁面。應用PHP的網頁與常規的HTML頁面並無二致,你可以用同樣的方式來創建、編輯它們。PHP允許你直接在HTML文件里寫入簡單的腳本,這一點與javascript非常相似。而不同的是,PHP不依賴於瀏覽器,是伺服器端的語言,而javascript卻是一種客戶端的嵌在HTML中的語言。概念上,PHP與Netscape
的LiveWire Pro產品,Microsoft的ASP以及SunMicrosystem 的JSP相似。
PHP不僅可以用來創建Web應用程序,也可以用來開發普通的單機應用程序。
PHP的強勁之處在於:
·PHP是一項最優秀的技術。其它技術,如PERL,Python, Tcl, VB script, ASP 相對來說,都是陳舊低劣
的。即使是Java/JSP,也在PHP之下。
·開放源碼
·廣泛的資料庫連接
·大量的擴展庫
·作為一種多用途的腳本語言,比PERL,VB script, ASP, JSP都要優秀。
為什麼選擇PHP?因為PHP是最好的,原因如下:
·PERL「味道不好」,因為其程序不易閱讀和維護,且不是面向對象的。把PERL忘了,轉向PHP吧。PERL程序員將拋棄PERL,因為他們愛上了PHP!
PHP實際上就是「現代版的PERL」,只是名稱不同而已。
·Java
是面向對象的,但速度很慢。Java程序遠行起來很慢,對它唯一的抱怨就是——「Java,真是慢的糟糕」。而且十分復雜(具有許多層,如JVM,JIT
等等)。這往往誘發問題。既然有了Linux,為什麼還要Java 呢?
·Python「不錯」,但沒有C語言中的括弧和大括弧,而這在vi編輯器中對操控代碼非常有用。如果不能利用vi/emacs編輯器搜索括弧/大括弧的命令迅速操控代碼,那麼就好象斷了手一樣。PHP在技術上比Python更加先進。
·PHP是最好的,因為它面向對象,並且吸收了C/C++/Java/PERL的精華。PHP可以替代PERL,Python, Java,C,
C++, awk, Unix shell 腳本,Visual Basic 和其它語言!!
PHP直接運行,而且是由C寫成的。
·每一個電腦程序員都知道PHP是最好的,不信問一下你旁邊的程序員。
·只有PHP才能稱雄於21世紀、22世紀以及更遠的將來。
·為什麼我們認為PERL,Python和Java程序員會將歸附PHP,這里有一個很重要的原因。
以前,世界上許多公司都把PHP當作是一個「高度機密,嚴格保密」的電腦程序語言,但是現在它已經變成最為著名的,在Web,
Internet, E-commerce以及
B2B等諸多項目上應用最廣泛的面向對象的腳本語言。即使是在今天,仍有許多競爭性(competing)公司把PHP當作是高度機密的東西,決不向外界(競爭對手)透露半點。
PHP將如同暴風雨一般席捲整個世界,IT工業將為之震驚。PHP的力量在於它是跨平台的,可以運行在任何地方。如Linux,Windows
95/98/NT/2000/XP, Solaris, HPUX
以及各種UNIX。PHP只需寫一次,就可以配置在任何地方。PHP可以運行在Apache,Microsoft IIS等多種Web伺服器上。
PHP比Java快5到20倍!!實際的比較測試顯示,PHP的運行速度是Java3.7倍左右。PHP太容易使用了,你可以用它在非常短的時間里,非常迅速的開發出非常復雜的web,e-commerce和一般的單機應用程序。(在將來,PHP將會模仿Java大多數的功能,相信Java程序員也會喜歡上它。PHP將包含Java中的關鍵字,如class,extends,interface,
implements, public,protected, private 等等等等。)
PHP具有面向對象特性,它吸收了Java, C++, PERL
和C的最優秀的部分。PHP可以說是所有腳本/編程語言中的寶石。不久,它就會成為全世界程序員的「麥加聖地」。PHP即可以運行在Window95/NT/2000/XP上,也可以運行在各種UNIX上。
們將大吃一驚——PHP極有可能成為21世紀的電腦編程語言。
可以使用Zend Optimizer對PHP進行編譯和優化,從而使它運行的更快。PHP4.0中已經集成了Zend Optimizer。
首先,你在開發、測試、除錯過程中,用PHP腳本語言編寫你的應用程序。一旦項目完成,你便可以用Zend編譯器,將PHP文件編譯成運行速度更快的可執行程序。
⑸ 運用PHP可以做什麼項目啊
運用PHP的話可以做的項目太多了,因為PHP也是屬於後台語言的,而且可以做系統,可以做軟體,也可以做網站的,所以說學習PHP的話可以寫後台服務語言。
計算機俗稱電腦,是一種用於高速計算的電子計算機器,可以進行數值計算,又可以進行邏輯計算,還具有存儲記憶功能。是能夠按照程序運行,自動、高速處理海量數據的現代化智能電子設備。由硬體系統和軟體系統所組成,沒有安裝任何軟體的計算機稱為裸機。
可分為超級計算機、工業控制計算機、網路計算機、個人計算機、嵌入式計算機五類,較先進的計算機有生物計算機、光子計算機、量子計算機、神經網路計算機。蛋白質計算機等。
當今計算機系統的運算速度已達到每秒萬億次,微機也可達每秒幾億次以上,使大量復雜的科學計算問題得以解決。例如:衛星軌道的計算、大型水壩的計算、24小時天氣預報的計算等,過去人工計算需要幾年、幾十年,而現在用計算機只需幾天甚至幾分鍾就可完成。
科學技術的發展特別是尖端科學技術的發展,需要高度精確的計算。計算機控制的導彈之所以能准確地擊中預定的目標,是與計算機的精確計算分不開的。一般計算機可以有十幾位甚至幾十位(二進制)有效數字,計算精度可由千分之幾到百萬分之幾,是任何計算工具所望塵莫及的。
隨著計算機存儲容量的不斷增大,可存儲記憶的信息越來越多。計算機不僅能進行計算,而且能把參加運算的數據、程序以及中間結果和最後結果保存起來,以供用戶隨時調用;還可以對各種信息(如視頻、語言、文字、圖形、圖像、音樂等)通過編碼技術進行算術運算和邏輯運算,甚至進行推理和證明。
計算機內部操作是根據人們事先編好的程序自動控制進行的。用戶根據解題需要,事先設計好運行步驟與程序,計算機十分嚴格地按程序規定的步驟操作,整個過程不需人工干預,自動執行,已達到用戶的預期結果。
超級計算機(supercomputers)通常是指由數百數千甚至更多的處理器(機)組成的、能計算普通PC機和伺服器不能完成的大型復雜課題的計算機。超級計算機是計算機中功能最強、運算速度最快、存儲容量最大的一類計算機,是國家科技發展水平和綜合國力的重要標志。
超級計算機擁有最強的並行計算能力,主要用於科學計算。在氣象、軍事、能源、航天、探礦等領域承擔大規模、高速度的計算任務。
在結構上,雖然超級計算機和伺服器都可能是多處理器系統,二者並無實質區別,但是現代超級計算機較多採用集群系統,更注重浮點運算的性能,可看著是一種專注於科學計算的高性能伺服器,而且價格非常昂貴。
一般的超級計算器耗電量相當大,一秒鍾電費就要上千,超級計算器的CPU至少50核也就是說是家用電腦的10倍左右,處理速度也是相當的快,但是這種CPU是無法購買的,而且價格要上千萬。
⑹ PHP流(Stream)的概述與使用詳解
在現代 PHP 特性中,流或許是最出色但使用率最低的。雖然 PHP 4.3 就引入了流,但是很多開發者並不知道流的存在,因為人們很少提及流,而且流的文檔也很匱乏。PHP 官方文檔對流的解釋如下:
可能看完這段解釋後還是雲里霧里,我們簡化一下,流的作用是在出發地和目的地之間傳輸數據。出發地和目的地可以是文件、命令行進程、網路連接、ZIP 或 TAR 壓縮文件、臨時內存、標准輸入或輸出,或者是通過 PHP 流封裝協議實現的任何其他資源。
如果你讀寫過文件,就用過流;如果你從 php://stdin 讀取過數據,或者把輸入寫入 php://stdout ,也用過流。流為 PHP 的很多 IO 函數提供了底層實現,如 file_get_contents、fopn、fread 和 fwrite 等。PHP 的流函數提供了不同資源的統一介面。
我們可以把流比作管道,把水(資源數據)從一個地方引到另一個地方。在水從出發地到目的地的過程中,我們可以過濾水,可以改變水質,可以添加水,也可以排出水。
流式數據的種類各異,每種類型需要獨特的協議,以便讀寫數據,我們稱這些協議為 流封裝協議 。例如,我們可以讀寫文件系統,可以通過 HTTP、HTTPS 或 SSH 與遠程 Web 伺服器通信,還可以打開並讀寫 ZIP、RAR 或 PHAR 壓縮文件。這些通信方式都包含下述相同的過程:
1.開始通信
2.讀取數據
3.寫入數據
4.結束通信
雖然過程是一樣的,但是讀寫文件系統中文件的方式與收發 HTTP 消息的方式有所不同,流封裝協議的作用是使用通用的介面封裝這種差異。
每個流都有一個協議和一個目標。指定協議和目標的方法是使用流標識符:<scheme>://<target>,其中 <scheme> 是流的封裝協議,<target> 是流的數據源。
http://流封裝協議
下面使用 HTTP 流封裝協議創建了一個與 Flicker API 通信的 PHP 流:
不要以為這是普通的網頁 URL,file_get_contents() 函數的字元串參數其實是一個流標識符。http 協議會讓 PHP 使用 HTTP 流封裝協議,在這個參數中,http 之後是流的目標。
我們通常使用 file_get_contents()、fopen()、fwrite() 和 fclose() 等函數讀寫文件系統,因為 PHP 默認使用的流封裝協議是 file://,所以我們很少認為這些函數使用的是 PHP 流。下面的示例演示了使用 file:// 流封裝協議創建一個讀寫 /etc/hosts 文件的流:
我們通常會省略掉 file:// 協議,因為這是 PHP 使用的默認值。
php://流封裝協議
編寫命令行腳本的 PHP 開發者會感激 php:// 流封裝協議,這個流封裝協議的作用是與 PHP 腳本的標准輸入、標准輸出和標准錯誤文件描述符通信。我們可以使用 PHP 提供的文件系統函數打開、讀取或寫入下面四個流:
1. php://stdin :這是個只讀 PHP 流,其中的數據來自標准輸入。PHP 腳本可以使用這個流接收命令行傳入腳本的信息;
2. php://stdout :把數據寫入當前的輸出緩沖區,這個流只能寫,無法讀或定址;
3. php://memory :從系統內存中讀取數據,或者把數據寫入系統內存。缺點是系統內存有限,所有使用 php://temp 更安全;
4. php://temp :和 php://memory 類似,不過,沒有可用內存時,PHP 會把數據寫入這個臨時文件。
其他流封裝協議
PHP 和 PHP 擴展還提供了很多其他流封裝協議,例如,與 ZIP 和 TAR 壓縮文件、FTP 伺服器、數據壓縮庫、Amazon API、Dropbox API 等通信的流封裝協議。需要注意的是,PHP 中的 fopen()、fgets()、fputs()、feof() 以及 fclose() 等函數不僅可以用來處理文件系統中的文件,還可以在所有支持這些函數的流封裝協議中使用。
自定義流封裝協議
我們還可以自己編寫 PHP 流封裝協議。PHP 提供了一個示例 StreamWrapper 類,演示如何編寫自定義的流封裝協議,支持部分或全部 PHP 文件系統函數。關於如何編寫,具體請參考以下文檔:
http://php.net/manual/zh/class.streamwrapper.php
http://php.net/manual/zh/stream.streamwrapper.example-1.php
有些 PHP 流能夠接受一系列可選的參數,這些參數叫流上下文,用於定製流的行為。不同的流封裝協議使用的流上下文有所不同,流上下文使用 stream_context_create() 函數創建,這個函數返回的上下文對象可以傳入大多數文件系統函數。
例如,你知道可以使用 file_get_contents() 發送 HTTP POST 請求嗎?使用一個流上下文對象即可實現:
流過濾器
目前為止我們討論了如何打開流,讀取流中的數據,以及把數據寫入流。不過,PHP 流真正強大的地方在於過濾、轉換、添加或刪除流中傳輸的數據,例如,我們可以打開一個流處理 Markdown 文件,在把文件內容讀入內存的過程中自動將其轉化為 HTML。
運行該腳本,輸出的都是大寫字母:
我們還可以使用 php://filter 流封裝協議把過濾器附加到流上,不過,使用這種方式之前必須先打開 PHP 流:
這個方式實現效果和 stream_filter_append() 函數一樣,但是相比之下更為繁瑣。不過,PHP 的某些文件系統函數在調用後無法附加過濾器,例如 file() 和 fpassthru(),使用這些函數時只能使用 php://filter 流封裝協議附加流過濾器。
自定義流過濾器
我們還可以編寫自定義的流過濾器。其實,大多數情況下都要使用自定義的流過濾器,自定義的流過濾器是個 PHP 類,繼承內置的 php_user_filter 類( http://php.net/manual/zh/class.php-user-filter.php ),且必須實現 filter()、onCreate() 和 onClose() 方法,最後,必須使用 stream_filter_register() 函數注冊自定義的流過濾器。
然後,我們必須使用 stream_filter_register() 函數注冊這個自定義的 DirtyWordsFilter 流過濾器:
第一個參數用於標識這個自定義過濾器的過濾器名,第二個參數是這個自定義過濾器的類名。接下來就可以使用這個自定義的流過濾器了:
修改 test.txt 內容如下:
運行上面的自定義過濾器腳本,結果如下:
stream_bucket_append函數:為隊列添加數據
stream_bucket_make_writeable函數:從操作的隊列中返回一個數據對象
stream_bucket_new函數:為當前隊列創建一個新的數據
stream_bucket_prepend函數:預備數據到隊列
stream_context_create函數:創建數據流上下文
stream_context_get_default函數:獲取默認的數據流上下文
stream_context_get_options函數:獲取數據流的設置
stream_context_set_option函數:對數據流、數據包或者上下文進行設置
stream_context_set_params函數:為數據流、數據包或者上下文設置參數
stream__to_stream函數:在數據流之間進行復制操作
stream_filter_append函數:為數據流添加過濾器
stream_filter_prepend函數:為數據流預備添加過濾器
stream_filter_register函數:注冊一個數據流的過濾器並作為PHP類執行
stream_filter_remove函數:從一個數據流中移除過濾器
stream_get_contents函數:讀取數據流中的剩餘數據到字元串
stream_get_filters函數:返回已經注冊的數據流過濾器列表
stream_get_line函數:按照給定的定界符從數據流資源中獲取行
stream_get_meta_data函數:從封裝協議文件指針中獲取報頭/元數據
stream_get_transports函數:返回注冊的Socket傳輸列表
stream_get_wrappers函數:返回注冊的數據流列表
stream_register_wrapper函數:注冊一個用PHP類實現的URL封裝協議
stream_select函數:接收數據流數組並等待它們狀態的改變
stream_set_blocking函數:將一個數據流設置為堵塞或者非堵塞狀態
stream_set_timeout函數:對數據流進行超時設置
stream_set_write_buffer函數:為數據流設置緩沖區
stream_socket_accept函數:接受由函數stream_ socket_server()創建的Socket連接
stream_socket_client函數:打開網路或者UNIX主機的Socket連接
stream_socket_enable_crypto函數:為一個已經連接的Socket打開或者關閉數據加密
stream_socket_get_name函數:獲取本地或者網路Socket的名稱
stream_socket_pair函數:創建兩個無區別的Socket數據流連接
stream_socket_recvfrom函數:從Socket獲取數據,不管其連接與否
stream_socket_sendto函數:向Socket發送數據,不管其連接與否
stream_socket_server函數:創建一個網路或者UNIX Socket服務端
stream_wrapper_restore函數:恢復一個事先注銷的數據包
stream_wrapper_unregister函數:注銷一個URL地址包
整合資料
本文整合於以下兩篇文章
https://blog.csdn.net/qq756684177/article/details/81518647
https://xueyuanjun.com/post/7459.html
⑺ PHP,Java,Python,C,C++ 這幾種編程語言都各有什麼特點或優點
說到底還是用途不一樣。。性能不一樣。。。
先說C吧,它是現代編程語言的祖師爺,所以非常古老了,在現代應用中使用不多。但由於C是祖師爺,所以絕大部分語言,寫法都和C語言差不多。。。常常用作學習其他語言的基礎。。而C語言也有其他語言不可替代的用途,現在最主要的應用就是單片機。。。單片機是啥?就是用C語言控制一些簡單的電子元件。。。比如電視用的遙控器,其實就是一個單片機。
PHP是用來做網站的,其實從技術角度,屬於第一代的後端技術(植入式腳本技術),現在最新的後端技術,已經發展到第三代了(MVC架構),因此從技術上講,PHP早該過時了,但由於市場需求的存在,所以它依然是做網站後台的主流之一。。就類似於WindowsXP一樣,技術上太淘汰了,但市場卻依然是主流,普及度依然很高。缺點一大堆,但又個最主要的優勢,就是簡單。。。MVC雖好,但學習難度遠比PHP要高的多。
C++是面向對象的C語言,由於偏底層,所以性能非常高,僅次於C語言,主要用在一個要求高性能的領域。。。這個不好說,因為實際需求上,用處挺雜的,而且也確實不太好學。。因為它把C語言面向過程的那套東西,和JAVA面向對象的那些東西,堆砌到了一起。。也就同時把兩種完全不同的思想揉在了一起。。個人的理解是,它就像周星馳電影里的那個「要你命3000」,把蒼蠅拍,殺蟲劑,手槍,手榴彈,滅鼠靈,用一根麻繩串在一起。。。殺蟲可以,滅鼠可以,殺人也可以,堪稱無所不能。。。但用起來,真是麻煩死了。。所以對於很多人來說,認可它的地位,承認它的功能,但敬而遠之。
JAVA是今天真正意義上的大道正宗,名門正派。。。。丐幫有降龍十八掌,華山派有獨孤九劍。。但你卻很難說出,少林派有什麼武功特別強。。而它又是公認的名門正宗。。。這其實就已經說明問題了,JAVA沒有什麼特別強的方面,但每個方面都不弱。。整體平均值,便非常高。。JAVA還有一個比較突出的優勢,就是它是安卓系統的官方開發語言。。既然說到了少林,就不得不提一下武當。。。那就是微軟的官方語言C#。。。.C#和JAVA相比,其實80%都是一樣的。。幾乎等於學一門,會兩門,C#比JAVA稍微簡單一些,IDE也好一些,其實比JAVA更適合新手,但由於之前不能跨平台,所以流行度比JAVA低,但確是游戲開發行業的第一大語言。。JAVA與C#基本可以看成一門語言的兩種方言。。英式英語和美式英語的差別一樣。。說到底還是半斤八兩。。。一個是傳統應用和安卓系統的第一大語言,一個是WINDOWS系統和游戲開發的第一大語言。。而且學一門會兩門,你還要求啥?
Python也是個很有歷史的語言,誕生時間和JAVA,C#差不多,但今天卻依然非常時髦。。因為它的語法,簡潔,優雅,風騷到了極致。。像寫信一樣寫代碼。。而又無所不能,JAVA和C#能做到的,Python幾乎一樣都不少。。。簡單易學,尤其受到初學者喜愛。。但Python更像一把雙刃劍,優點特別突出,缺點也特別明顯,就是特別慢。。。一般認為,Python比JAVA慢25倍到50倍。。還有一門語言叫Ruby,和Python相似,也是語法特別簡潔。。但比Python更慢,用途也不如Python。。。基本可以看作華山,丐幫,在某些情況下,可以勝過少林武當。。但整體上比較,還是要差一截。。但即便如此,它的前景也是非常好的。。由於語法簡單,更容易被機器解析,所以在人工智慧領域非常有前途。比如那個下圍棋的Alpha Go,以及中國的北斗衛星定位系統。。都有大量的Python代碼在裡面。
⑻ php語言字典代碼
求一PHP演算法,字典生成。時間一到再加100分。如:字元:0-9,長度:1,
那就生成0,1,2,3,4,5,6,7,8,9
長度:2,就會生成00-99
現在要求字元可以包括a-z,或者其他特殊符號,求一高效的生成演算法。
參考答案一
function get_string($strlen){
$source='0123456789'; //任意字元
$len = strlen($source); //長度
$return = array();
for($i = 0 ;$i < $len;$i++){
for($j = 0;$j < $strlen;$j++){
$return[$i] .= $i;
}
}
return implode(',', $return);
}
如果輸入長度2: 輸出結果就是:
00,11,22,33,44,55,66,77,88,99
參考答案二
優化了進位演算法:
PHP code =0;$no--){ $word=$source{$series[$no]}.$word; $series[$no]+=$tonext_value; if($no>0){ if($series[$no]==$len){ $series[$no]=0; $tonext_value=1; }else{ $tonext_value=0; } } } echo "$word "; } } gene_dic(2); ?>
簡單的說,我會把這個理解為0-9(十進制)下十個數字生成兩位數字、可重復的排列問題。
排列演算法我自己建立過的就是簡單的N進制下的+1演算法,保證可以遍歷。
即:
初始化到0,
1. +1
2. 是否超過要生成的位數?否,則回到1;
3. 輸出
參考答案三
PHP code =0;$no--){//循環遍歷數組每次從源字串中取一個字元,為便於進位運算,取字元是從後往前取 $word=$source{$series[$no]}.$word;//先取出一個字元 //取出一個字元後就要判斷當前數組元素如何如果改變值,為下一次“大循環”做准備 if($no==$n-1){//末位的判斷,它比較特殊,每次大循環都要增值 if($series[$no]==$len-1){ $series[$no]=0; $tonext_value=1;//歸零時就進位 }else{ $series[$no]+=1; $tonext_value=0;//未歸零就增值,不進位 } }elseif($no<$n-1){//中間位的進位判斷 $series[$no]+=$tonext_value;//先取得上一位的進位值 if($series[$no]==$len){ $series[$no]=0; $tonext_value=1;//歸零了就繼續進位 }else{ $tonext_value=0;//不歸零就不進位 } }else{ $series[$no]+=$tonext_value;//大循環次數決定了“老大”是只進不出的。 } } echo "$word ";//輸入單詞 } } gene_dic(2);//測試,結果OK。
參考答案四
PHP code =0;$no--){//循環遍歷數組每次從源字串中取一個字元,為便於進位運算,取字元是從後往前取 $word=$source{$series[$no]}.$word;//先取出一個字元 //取出一個字元後就要判斷當前數組元素如何如果改變值,為下一次“大循環”做准備 if($no==$n-1){//末位的判斷,它比較特殊,每次大循環都要增值 if($series[$no]==$len-1){ $series[$no]=0; $tonext_value=1;//歸零時就進位 }else{ $series[$no]+=1; $tonext_value=0;//未歸零就增值,不進位 } }elseif($no<$n-1){//中間位的進位判斷 $series[$no]+=$tonext_value;//先取得上一位的進位值 if($series[$no]==$len){ $series[$no]=0; $tonext_value=1;//歸零了就繼續進位 }else{ $tonext_value=0;//不歸零就不進位 } }else{ $series[$no]+=$tonext_value;//大循環次數決定了“老大”是只進不出的。 } } echo "$word ";//輸入單詞 } } gene_dic(2);//測試,結果OK。
參考答案五
應該是:
function get_string($strlen){
$source='0123456789';
$len = strlen($source);
$return = array();
for($i = 0 ;$i < $len;$i++){
for($j = 1;$j <= $strlen;$j++){
$return[$i] .= substr($source,$i,1);
}
}
return implode(',', $return);
}
【拓展閱讀】如何開始一門語言的學習
一門語言從發明到演進必有原因。
現在還有很多人推薦學習不同的語言。通過比較,了解它的發展史,
創始人的初心等因素都需要留意。多個思考,這個語言在5年,在10年後還是否保持活力?
當有幾個類似的語言被選擇時,我們不妨對它們做一個Swat分析。
列出這些語言的共同點,還有它們之間的規則差異。
了解語言的發展史
開發語言從匯編開始,如最早的計算機ENIAC,使用的就是它來編程。
再到Fortarin,再到C語言,Cobol,Basic。每一個語言都與當時發展的階段有點密切關聯。
人類的每個發明都與懶惰有關,語言也是為便捷性而生。有的語言
C是除匯編外最重視效率的語言,擴展的C++也繼承了此特性。Perl是做文本處理效率最佳的語言,雖然它的發展有點慢。PHP做Web開發,是“世界上最好的.語言”,Python的閱讀性和大數據處理都做得樣樣俱佳。
當了解語言的歷史沿革後,會讓我們對其創始人有很強烈的興趣,成為忠實的腦殘粉,學習該語言的興趣會更濃烈。
人們常常說某個語言比哪個好,這其實沒有必要。不必要為其它人的語言所惑,需要你自己做出選擇。
語言的共通點
這個星球的人都是一個鼻子兩雙只水汪汪的大眼睛,與人們的模樣一般,編程語言也有一個大致相同的長相。
語法:這是開發此語言定義的規則“套路”:
運算符順序,變數常量定義/作用域,表達式定義,字元串定義,行尾結束符等。
流程式控制制:循環控制
這些語法都是成對的,如if,for,while,foreach,有的語言還提供goto這樣類似匯編語言的語法。
函數與方法
一些能夠復用的高質量代碼組合。函數執行後有返回,有遞歸,有嵌套,還有幹完活就完事的簡單任務。有靜態函數和動態函數區分。
容器
數組,哈希表(也叫散列),字典等用來保存數據的容器。
錯誤/例外處理
現代編程語言基本都支持出錯的拋出,除了C語言之外。
比如硬碟不足,網路出錯,黑客攻擊等情形。就像購物中心裡出現煤氣泄露時,監測設備,物聯網設備能夠及時記錄與傳遞給指揮中心。
沒有錯誤拋出的語言,需要自己考慮盡可能出錯的場景並處理,比如:
if(is_overfllow)
//處理
if(network_error)
//處理
可以還有不少需要關注的維度,這會讓代碼變得艱澀難懂,也難以維護。
我們可以用這樣的方式,讓其更簡潔:
on error goto ERROR
ERROR:
..//
但這總是會需要我們照顧很多情形。於是C++推出了一個語法:
try{
//可能會出錯的代碼
//可能會出錯的代碼
}catch{
//處理出錯的邏輯
//處理出錯的邏輯
}finally{
//出不出錯都要執行的代碼
}
最後一句是微軟公司給業界提供貢獻的finally代碼塊。
以上這些成為語言處理異常機制的基礎。
容器
容器是很重要的一節,所以我們單獨再提出來。很多邏輯處理,使用容器保存數據,該語言會提供便捷的方法來提供存取。
比如C、Perl、PHP、Ruby中均提供的數組和關聯數組,LISP提供的列表,Java、Python提供的元組、鏈表等。
雖然名字相同,但是實現方式卻是完全不同,使用方法當然也不一樣。
沒有萬能的容器,只有最合適的。可以從節省內存,節約時間還是編碼效率等綜合考慮。
字元串與字元編碼
是否支持unicode編碼。從摩斯碼到ASCII到統一的Unicode編碼支持。
並發處理
有的語言在設計時並無此方面的考慮,或者天生設計存在缺陷。
即多線程,多進程的概念。包括共享,鎖,事備等特性。
面向對象
支持類,繼承,模塊,包,命名空間,閉包等。有這些特性才會讓人們的工作變得更便利、更有效率。
小結
學習一門語言的關鍵,需要我們在平靜地心緒下,帶著濃厚的興趣去學習,在比較中學習,在歷史中學習。
有時候感覺還是不夠通暢,先做知識的搬運工也是不錯。另外,不斷的實踐會讓我們的信心更足。
⑼ php是什麼意思
PHP一開始叫Personal Homepage後來改叫Personal Homepage Programme 最後才叫Hypertext Preprocessor。PHP是一種 HTML 內嵌式的語言,可以用C、Java、Perl等語言編寫,一個寫好的PHP文件你可以簡單理解為一個網頁,但是如果你的機子沒裝PHP和APACHE或IIS伺服器的話是不能以網頁的格式查看裡面的內容的。
你如果要查看PHP文件裡面的內容即源程序那麼你可以用記事本打開,WORD等這些文字處理工具都可以看到PHP的內容,如果你是想以網頁的形式查看PHP那麼你首先得安裝PHP和APACHE伺服器
安裝方法如下:
Apache http://httpd.apache.org/
最流行的HTTP伺服器軟體之一。快速、可靠、可通過簡單的API擴展,Perl/Python解釋器可被編譯到伺服器中,完全免費,完全源代碼開放。
我下載的是for Windows版本,目前最新版本是:2.0.54
PHP http://www.php.net/
PHP 是一種 HTML 內嵌式的語言。而PHP獨特的語法混合了 C、Java、Perl 以及 PHP 式的新語法。它可以比 CGI 或者 Perl 更快速的執行動態網頁。
我下載的是for Windows版本,目前最新版本是:5.0.4
MySQL http://www.mysql.com/
是一個多線程的,結構化查詢語言(SQL)資料庫伺服器。SQL 在世界上是最流行的資料庫語言。MySQL 的執行性能非常高,運行速度非常快,並非常容易使用。
我下載的是for Windows版本,目前最新版本是:5.0.4 Beta
phpMyAdmin http://www.phpmyadmin.net/
phpMyAdmin 是一個用PHP編寫的,可以通過互聯網控制和操作MySQL。通過phpMyAdmin可以完全對資料庫進行操作。
我下載的是for Windows版本,目前最新版本是:2.6.2-pl1
安裝apache和PHP
下面是我的安裝記錄:
選擇80埠,將apache安裝在 D:\apache下。
配置apache里的httpd.conf文件(conf目錄下,用記事本打開就行了,使用查找把下面提到的句子輸進去找出來)
找到 DocumentRoot "D:/apache/Apache2/htdocs" 將其改為WEB目錄D:/htdocs (文件夾名稱和路徑隨便你定,把你要看的文件放在這個文件夾裡面)
找到 DirectoryIndex index.html index.html.var 在後面加入 index.htm index.php default.php default.html
選擇模塊化模式安裝
找到 #LoadMole ssl_mole moles/mod_ssl.so 這行,在此行後加入一行
LoadMole php5_mole D:/php/php5apache2.dll
找到 AddType application/x-gzip .gz .tgz 這行,在此行後加入一行
AddType application/x-httpd-php .php
將php-5.0.4-Win32.zip里內容解壓到e:\php里,找到php.ini-recommended,重命名為php.ini並拷貝到windows目錄下。
NTFS上記得給伺服器開PHP.ini的讀許可權。
查找extension_dir後面的改為"D:/php/ext"
查找Windows Extensions,把下面有一排的;extension=php_***.dll的分號去掉,就是支持組件了。我把 extension=php_gd2.dll extension=php_mbstring.dll extension=php_mysql.dll 的分號去掉了。
php5默認不支持mysql了,所以要為他添加支持,除了extension=php_mysql.dll去分號之外,在php目錄里有個libmysql.dll文件,把它復制到系統的system32文件夾下,復制php.ini到windows目錄下。
此時PHP環境基本已經配置成功
在WEB根目錄里建一個名為test.php的文件內容如下
<? echo phpinfo(); ?>
重新啟動apache服務,用瀏覽器打開 http://localhost/test.php
如果可以看到php配置輸出信息就成功了
安裝mysql
將mysql安裝到指定目錄,然後安裝程序會引導你一步步配置。不過奇怪的是最後任務欄沒有出現Mysql的圖標。
修改mysql資料庫的root密碼
用cmd進入命今行模式輸入如下命令: ( 注: d:\mysql 為mysql安裝目錄)
cd d:\mysql\bin
mysqladmin -u root -p password 123456
回車出現
Enter password: ( 注:這是叫你輸入原密碼. 剛安裝時密碼為空,所以直接回車即可)
此時mysql 中賬號 root 的密碼 被改為 123456 安裝完畢
配置php.ini並測試mysql
找到extension_dir = "./" 改為 extension_dir = "D:/php/ext"
找到
;extension=php_mysql.dll
將';'去掉改為
extension=php_mysql.dll
找到
;session.save_path = "/tmp"
將';'去掉 設置你保存session的目錄,如
session.save_path = "D:/php/session_temp"
重啟apache服務
在Web根目錄下建立testdb.php文件內容如下:
<?php
$link=mysql_connect('localhost','root','123456');
if(!$link) echo "fail";
else echo "success";
mysql_close();
?>
用瀏覽器打開http://localhost/testdb.php 如果輸出success就OK了
phpmyadmin的安裝配置
將phpMyAdmin-V2.6.2-pl1.zip解壓到WEB根目錄中去,重命名文件夾為phpmyadmin或其它
打開phpmyadmin 目錄中的 config.inc.php
找到
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '123456';
分別填上用戶名和密碼
⑽ PHP5.4版本問題為何沒有VC6
哈哈,這簡單!win下的apache是用VC6編譯的,其插件(apachemole)也必須用VC6編譯。
PHP5.4為什麼不支持VC6?因為VC6太舊了,1998年的工具..
不能用是指php以apachemod的方式不能用。現代php都以fast-cgi的方式掛載支持apache,連微軟iis都放棄isapi轉採用fast-cgi了。在不同的進程下,VC9的phpfast-cgi通過進程間通訊支持apache,即使apache不是vc不是win版都沒問題。。
去下載apache的mod_fcgid,然後把php配置到fcgid上。就可以用了
搜一搜教程很多。