本文目錄一覽:
- 1、為什麼現在的大型網站還在使用php ?php對比jsp的優勢在哪裡
- 2、php主要用來做什麼??
- 3、大型的PHP應用,通常使用什麼應用做消息隊列?
- 4、4006869068 為什麼大型網站都是用PHP語言編寫?
為什麼現在的大型網站還在使用php ?php對比jsp的優勢在哪裡
LAMP
Linux,Apache,Mysql,Php
在開源界,廣泛應用
php語言簡單,學習成本低,自然開發成本低,開發的速度也比較快,
不過可移植性不高,擴展性不強。
現在的jsp可以和struts,webwork之類的框架結合起來,利用MVC的優勢,層次分明,結構清晰,易於維護。這方面php即使能做,也會比jsp複雜些。但是開發周期比php長。
網絡上的論壇以php居多,但是企業級的應用還是jsp或者asp.net多
php主要用來做什麼??
PHP 腳本主要用於以下三個領域:
1、服務端腳本。這是 PHP 最傳統,也是最主要的目標領域。開展這項工作需要具備以下三點:PHP 解析器(CGI 或者服務器模塊)、web 服務器和 web 瀏覽器。需要在運行 web 服務器時,安裝並配置 PHP,然後,可以用 web 瀏覽器來訪問 PHP 程序的輸出,即瀏覽服務端的 PHP 頁面。如果只是實驗 PHP 編程,所有的這些都可以運行在自己家裡的電腦中。請查閱安裝一章以獲取更多信息。
2、命令行腳本。可以編寫一段 PHP 腳本,並且不需要任何服務器或者瀏覽器來運行它。通過這種方式,僅僅只需要 PHP 解析器來執行。這種用法對於依賴 cron(Unix 或者 Linux 環境)或者 Task Scheduler(Windows 環境)的日常運行的腳本來說是理想的選擇。這些腳本也可以用來處理簡單的文本。請參閱 PHP 的命令行模式以獲取更多信息。
3、編寫桌面應用程序。對於有着圖形界面的桌面應用程序來說,PHP 或許不是一種最好的語言,但是如果用戶非常精通 PHP,並且希望在客戶端應用程序中使用 PHP 的一些高級特性,可以利用 PHP-GTK 來編寫這些程序。用這種方法,還可以編寫跨平台的應用程序。PHP-GTK 是 PHP 的一個擴展,在通常發布的 PHP 包中並不包含它。如果對 PHP-GTK 感興趣,請訪問其» 網站以獲取更多信息。
facebook、youbute 、新浪、百度、淘寶、搜狐和騰訊等等這些知名的網站都有很大一部分業務是也是用PHP來開發的
大型的PHP應用,通常使用什麼應用做消息隊列?
一、消息隊列概述\x0d\x0a消息隊列中間件是分布式系統中重要的組件,主要解決應用耦合,異步消息,流量削鋒等問題。實現高性能,高可用,可伸縮和最終一致性架構。是大型分布式系統不可缺少的中間件。\x0d\x0a目前在生產環境,使用較多的消息隊列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。\x0d\x0a二、消息隊列應用場景\x0d\x0a以下介紹消息隊列在實際應用中常用的使用場景。異步處理,應用解耦,流量削鋒和消息通訊四個場景。\x0d\x0a2.1異步處理\x0d\x0a場景說明:用戶註冊後,需要發註冊郵件和註冊短信。傳統的做法有兩種1.串行的方式;2.並行方式。\x0d\x0a(1)串行方式:將註冊信息寫入數據庫成功後,發送註冊郵件,再發送註冊短信。以上三個任務全部完成後,返回給客戶端。(架構KKQ:466097527,歡迎加入)\x0d\x0a(2)並行方式:將註冊信息寫入數據庫成功後,發送註冊郵件的同時,發送註冊短信。以上三個任務完成後,返回給客戶端。與串行的差別是,並行的方式可以提高處理的時間。\x0d\x0a假設三個業務節點每個使用50毫秒鐘,不考慮網絡等其他開銷,則串行方式的時間是150毫秒,並行的時間可能是100毫秒。\x0d\x0a因為CPU在單位時間內處理的請求數是一定的,假設CPU1秒內吞吐量是100次。則串行方式1秒內CPU可處理的請求量是7次(1000/150)。並行方式處理的請求量是10次(1000/100)。\x0d\x0a小結:如以上案例描述,傳統的方式系統的性能(並發量,吞吐量,響應時間)會有瓶頸。如何解決這個問題呢?\x0d\x0a引入消息隊列,將不是必須的業務邏輯,異步處理。改造後的架構如下:\x0d\x0a按照以上約定,用戶的響應時間相當於是註冊信息寫入數據庫的時間,也就是50毫秒。註冊郵件,發送短信寫入消息隊列後,直接返回,因此寫入消息隊列的速度很快,基本可以忽略,因此用戶的響應時間可能是50毫秒。因此架構改變後,系統的吞吐量提高到每秒20 QPS。比串行提高了3倍,比並行提高了兩倍。\x0d\x0a2.2應用解耦\x0d\x0a場景說明:用戶下單後,訂單系統需要通知庫存系統。傳統的做法是,訂單系統調用庫存系統的接口。如下圖:\x0d\x0a傳統模式的缺點:\x0d\x0a1) 假如庫存系統無法訪問,則訂單減庫存將失敗,從而導致訂單失敗;\x0d\x0a2) 訂單系統與庫存系統耦合;\x0d\x0a如何解決以上問題呢?引入應用消息隊列後的方案,如下圖:\x0d\x0a訂單系統:用戶下單後,訂單系統完成持久化處理,將消息寫入消息隊列,返回用戶訂單下單成功。\x0d\x0a庫存系統:訂閱下單的消息,採用拉/推的方式,獲取下單信息,庫存系統根據下單信息,進行庫存操作。\x0d\x0a假如:在下單時庫存系統不能正常使用。也不影響正常下單,因為下單後,訂單系統寫入消息隊列就不再關心其他的後續操作了。實現訂單系統與庫存系統的應用解耦。\x0d\x0a2.3流量削鋒\x0d\x0a流量削鋒也是消息隊列中的常用場景,一般在秒殺或團搶活動中使用廣泛。\x0d\x0a應用場景:秒殺活動,一般會因為流量過大,導致流量暴增,應用掛掉。為解決這個問題,一般需要在應用前端加入消息隊列。\x0d\x0a可以控制活動的人數;\x0d\x0a可以緩解短時間內高流量壓垮應用;\x0d\x0a用戶的請求,服務器接收後,首先寫入消息隊列。假如消息隊列長度超過最大數量,則直接拋棄用戶請求或跳轉到錯誤頁面;\x0d\x0a秒殺業務根據消息隊列中的請求信息,再做後續處理。\x0d\x0a2.4日誌處理\x0d\x0a日誌處理是指將消息隊列用在日誌處理中,比如Kafka的應用,解決大量日誌傳輸的問題。架構簡化如下:\x0d\x0a日誌採集客戶端,負責日誌數據採集,定時寫受寫入Kafka隊列;\x0d\x0aKafka消息隊列,負責日誌數據的接收,存儲和轉發;\x0d\x0a日誌處理應用:訂閱並消費kafka隊列中的日誌數據;\x0d\x0a以下是新浪kafka日誌處理應用案例:\x0d\x0a(1)Kafka:接收用戶日誌的消息隊列。\x0d\x0a(2)Logstash:做日誌解析,統一成JSON輸出給Elasticsearch。\x0d\x0a(3)Elasticsearch:實時日誌分析服務的核心技術,一個schemaless,實時的數據存儲服務,通過index組織數據,兼具強大的搜索和統計功能。\x0d\x0a(4)Kibana:基於Elasticsearch的數據可視化組件,超強的數據可視化能力是眾多公司選擇ELK stack的重要原因。\x0d\x0a2.5消息通訊\x0d\x0a消息通訊是指,消息隊列一般都內置了高效的通信機制,因此也可以用在純的消息通訊。比如實現點對點消息隊列,或者聊天室等。\x0d\x0a點對點通訊:\x0d\x0a客戶端A和客戶端B使用同一隊列,進行消息通訊。\x0d\x0a聊天室通訊:\x0d\x0a客戶端A,客戶端B,客戶端N訂閱同一主題,進行消息發布和接收。實現類似聊天室效果。\x0d\x0a以上實際是消息隊列的兩種消息模式,點對點或發布訂閱模式。模型為示意圖,供參考。\x0d\x0a三、消息中間件示例\x0d\x0a3.1電商系統\x0d\x0a消息隊列採用高可用,可持久化的消息中間件。比如Active MQ,Rabbit MQ,Rocket Mq。(1)應用將主幹邏輯處理完成後,寫入消息隊列。消息發送是否成功可以開啟消息的確認模式。(消息隊列返回消息接收成功狀態後,應用再返回,這樣保障消息的完整性)\x0d\x0a(2)擴展流程(發短信,配送處理)訂閱隊列消息。採用推或拉的方式獲取消息並處理。\x0d\x0a(3)消息將應用解耦的同時,帶來了數據一致性問題,可以採用最終一致性方式解決。比如主數據寫入數據庫,擴展應用根據消息隊列,並結合數據庫方式實現基於消息隊列的後續處理。\x0d\x0a3.2日誌收集系統\x0d\x0a分為Zookeeper註冊中心,日誌收集客戶端,Kafka集群和Storm集群(OtherApp)四部分組成。\x0d\x0aZookeeper註冊中心,提出負載均衡和地址查找服務;\x0d\x0a日誌收集客戶端,用於採集應用系統的日誌,並將數據推送到kafka隊列;\x0d\x0a四、JMS消息服務\x0d\x0a講消息隊列就不得不提JMS 。JMS(Java Message Service,Java消息服務)API是一個消息服務的標準/規範,允許應用程序組件基於JavaEE平台創建、發送、接收和讀取消息。它使分布式通信耦合度更低,消息服務更加可靠以及異步性。\x0d\x0a在EJB架構中,有消息bean可以無縫的與JM消息服務集成。在J2EE架構模式中,有消息服務者模式,用於實現消息與應用直接的解耦。\x0d\x0a4.1消息模型\x0d\x0a在JMS標準中,有兩種消息模型P2P(Point to Point),Publish/Subscribe(Pub/Sub)。\x0d\x0a4.1.1 P2P模式\x0d\x0aP2P模式包含三個角色:消息隊列(Queue),發送者(Sender),接收者(Receiver)。每個消息都被發送到一個特定的隊列,接收者從隊列中獲取消息。隊列保留着消息,直到他們被消費或超時。\x0d\x0aP2P的特點\x0d\x0a每個消息只有一個消費者(Consumer)(即一旦被消費,消息就不再在消息隊列中)\x0d\x0a發送者和接收者之間在時間上沒有依賴性,也就是說當發送者發送了消息之後,不管接收者有沒有正在運行,它不會影響到消息被發送到隊列\x0d\x0a接收者在成功接收消息之後需向隊列應答成功\x0d\x0a如果希望發送的每個消息都會被成功處理的話,那麼需要P2P模式。(架構KKQ:466097527,歡迎加入)\x0d\x0a4.1.2 Pub/sub模式\x0d\x0a包含三個角色主題(Topic),發布者(Publisher),訂閱者(Subscriber) 。多個發布者將消息發送到Topic,系統將這些消息傳遞給多個訂閱者。\x0d\x0aPub/Sub的特點\x0d\x0a每個消息可以有多個消費者\x0d\x0a發布者和訂閱者之間有時間上的依賴性。針對某個主題(Topic)的訂閱者,它必須創建一個訂閱者之後,才能消費發布者的消息。\x0d\x0a為了消費消息,訂閱者必須保持運行的狀態。\x0d\x0a為了緩和這樣嚴格的時間相關性,JMS允許訂閱者創建一個可持久化的訂閱。這樣,即使訂閱者沒有被激活(運行),它也能接收到發布者的消息。\x0d\x0a如果希望發送的消息可以不被做任何處理、或者只被一個消息者處理、或者可以被多個消費者處理的話,那麼可以採用Pub/Sub模型。\x0d\x0a4.2消息消費\x0d\x0a在JMS中,消息的產生和消費都是異步的。對於消費來說,JMS的消息者可以通過兩種方式來消費消息。\x0d\x0a(1)同步\x0d\x0a訂閱者或接收者通過receive方法來接收消息,receive方法在接收到消息之前(或超時之前)將一直阻塞;\x0d\x0a(2)異步\x0d\x0a訂閱者或接收者可以註冊為一個消息監聽器。當消息到達之後,系統自動調用監聽器的onMessage方法。\x0d\x0aJNDI:Java命名和目錄接口,是一種標準的Java命名系統接口。可以在網絡上查找和訪問服務。通過指定一個資源名稱,該名稱對應於數據庫或命名服務中的一個記錄,同時返回資源連接建立所必須的信息。\x0d\x0aJNDI在JMS中起到查找和訪問發送目標或消息來源的作用。(架構KKQ:466097527,歡迎加入)\x0d\x0a4.3JMS編程模型\x0d\x0a(1) ConnectionFactory\x0d\x0a創建Connection對象的工廠,針對兩種不同的jms消息模型,分別有QueueConnectionFactory和TopicConnectionFactory兩種。可以通過JNDI來查找ConnectionFactory對象。\x0d\x0a(2) Destination\x0d\x0aDestination的意思是消息生產者的消息發送目標或者說消息消費者的消息來源。對於消息生產者來說,它的Destination是某個隊列(Queue)或某個主題(Topic);對於消息消費者來說,它的Destination也是某個隊列或主題(即消息來源)。\x0d\x0a所以,Destination實際上就是兩種類型的對象:Queue、Topic可以通過JNDI來查找Destination。\x0d\x0a(3) Connection\x0d\x0aConnection表示在客戶端和JMS系統之間建立的鏈接(對TCP/IP socket的包裝)。Connection可以產生一個或多個Session。跟ConnectionFactory一樣,Connection也有兩種類型:QueueConnection和TopicConnection。\x0d\x0a(4) Session\x0d\x0aSession是操作消息的接口。可以通過session創建生產者、消費者、消息等。Session提供了事務的功能。當需要使用session發送/接收多個消息時,可以將這些發送/接收動作放到一個事務中。同樣,也分QueueSession和TopicSession。\x0d\x0a(5) 消息的生產者\x0d\x0a消息生產者由Session創建,並用於將消息發送到Destination。同樣,消息生產者分兩種類型:QueueSender和TopicPublisher。可以調用消息生產者的方法(send或publish方法)發送消息。\x0d\x0a(6) 消息消費者\x0d\x0a消息消費者由Session創建,用於接收被發送到Destination的消息。兩種類型:QueueReceiver和TopicSubscriber。可分別通過session的createReceiver(Queue)或createSubscriber(Topic)來創建。當然,也可以session的creatDurableSubscriber方法來創建持久化的訂閱者。\x0d\x0a(7) MessageListener\x0d\x0a消息監聽器。如果註冊了消息監聽器,一旦消息到達,將自動調用監聽器的onMessage方法。EJB中的MDB(Message-Driven Bean)就是一種MessageListener。\x0d\x0a深入學習JMS對掌握JAVA架構,EJB架構有很好的幫助,消息中間件也是大型分布式系統必須的組件。本次分享主要做全局性介紹,具體的深入需要大家學習,實踐,總結,領會。\x0d\x0a五、常用消息隊列\x0d\x0a一般商用的容器,比如WebLogic,JBoss,都支持JMS標準,開發上很方便。但免費的比如Tomcat,Jetty等則需要使用第三方的消息中間件。本部分內容介紹常用的消息中間件(Active MQ,Rabbit MQ,Zero MQ,Kafka)以及他們的特點。\x0d\x0a5.1 ActiveMQ\x0d\x0aActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規範的 JMS Provider實現,儘管JMS規範出台已經是很久的事情了,但是JMS在當今的J2EE應用中間仍然扮演着特殊的地位。\x0d\x0aActiveMQ特性如下:\x0d\x0a⒈ 多種語言和協議編寫客戶端。語言: Java,C,C++,C#,Ruby,Perl,Python,PHP。應用協議: OpenWire,Stomp REST,WS Notification,XMPP,AMQP\x0d\x0a⒉ 完全支持JMS1.1和J2EE 1.4規範 (持久化,XA消息,事務)\x0d\x0a⒊ 對spring的支持,ActiveMQ可以很容易內嵌到使用Spring的系統裡面去,而且也支持Spring2.0的特性\x0d\x0a⒋ 通過了常見J2EE服務器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的測試,其中通過JCA 1.5 resource adaptors的配置,可以讓ActiveMQ可以自動的部署到任何兼容J2EE 1.4 商業服務器上\x0d\x0a⒌ 支持多種傳送協議:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA\x0d\x0a⒍ 支持通過JDBC和journal提供高速的消息持久化\x0d\x0a⒎ 從設計上保證了高性能的集群,客戶端-服務器,點對點\x0d\x0a⒏ 支持Ajax\x0d\x0a⒐ 支持與Axis的整合\x0d\x0a⒑ 可以很容易得調用內嵌JMS provider,進行測試\x0d\x0a5.2 RabbitMQ\x0d\x0aRabbitMQ是流行的開源消息隊列系統,用erlang語言開發。RabbitMQ是AMQP(高級消息隊列協議)的標準實現。支持多種客戶端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX,持久化。用於在分布式系統中存儲轉發消息,在易用性、擴展性、高可用性等方面表現不俗。\x0d\x0a幾個重要概念:\x0d\x0aBroker:簡單來說就是消息隊列服務器實體。\x0d\x0aExchange:消息交換機,它指定消息按什麼規則,路由到哪個隊列。\x0d\x0aQueue:消息隊列載體,每個消息都會被投入到一個或多個隊列。\x0d\x0aBinding:綁定,它的作用就是把exchange和queue按照路由規則綁定起來。\x0d\x0aRouting Key:路由關鍵字,exchange根據這個關鍵字進行消息投遞。\x0d\x0avhost:虛擬主機,一個broker里可以開設多個vhost,用作不同用戶的權限分離。\x0d\x0aproducer:消息生產者,就是投遞消息的程序。\x0d\x0aconsumer:消息消費者,就是接受消息的程序。\x0d\x0achannel:消息通道,在客戶端的每個連接里,可建立多個channel,每個channel代表一個會話任務。\x0d\x0a消息隊列的使用過程,如下:\x0d\x0a(1)客戶端連接到消息隊列服務器,打開一個channel。\x0d\x0a(2)客戶端聲明一個exchange,並設置相關屬性。\x0d\x0a(3)客戶端聲明一個queue,並設置相關屬性。\x0d\x0a(4)客戶端使用routing key,在exchange和queue之間建立好綁定關係。\x0d\x0a(5)客戶端投遞消息到exchange。\x0d\x0aexchange接收到消息後,就根據消息的key和已經設置的binding,進行消息路由,將消息投遞到一個或多個隊列里。\x0d\x0a5.3 ZeroMQ\x0d\x0a號稱史上最快的消息隊列,它實際類似於Socket的一系列接口,他跟Socket的區別是:普通的socket是端到端的(1:1的關係),而ZMQ卻是可以N:M 的關係,人們對BSD套接字的了解較多的是點對點的連接,點對點連接需要顯式地建立連接、銷毀連接、選擇協議(TCP/UDP)和處理錯誤等,而ZMQ屏蔽了這些細節,讓你的網絡編程更為簡單。ZMQ用於node與node間的通信,node可以是主機或者是進程。\x0d\x0a引用官方的說法: “ZMQ(以下ZeroMQ簡稱ZMQ)是一個簡單好用的傳輸層,像框架一樣的一個socket library,他使得Socket編程更加簡單、簡潔和性能更高。是一個消息處理隊列庫,可在多個線程、內核和主機盒之間彈性伸縮。ZMQ的明確目標是“成為標準網絡協議棧的一部分,之後進入Linux內核”。現在還未看到它們的成功。但是,它無疑是極具前景的、並且是人們更加需要的“傳統”BSD套接字之上的一 層封裝。ZMQ讓編寫高性能網絡應用程序極為簡單和有趣。”\x0d\x0a特點是:\x0d\x0a高性能,非持久化;\x0d\x0a跨平台:支持Linux、Windows、OS X等。\x0d\x0a多語言支持; C、C++、Java、.NET、Python等30多種開發語言。\x0d\x0a可單獨部署或集成到應用中使用;\x0d\x0a可作為Socket通信庫使用。\x0d\x0a與RabbitMQ相比,ZMQ並不像是一個傳統意義上的消息隊列服務器,事實上,它也根本不是一個服務器,更像一個底層的網絡通訊庫,在Socket API之上做了一層封裝,將網絡通訊、進程通訊和線程通訊抽象為統一的API接口。支持“Request-Reply “,”Publisher-Subscriber“,”Parallel Pipeline”三種基本模型和擴展模型。\x0d\x0aZeroMQ高性能設計要點:\x0d\x0a1、無鎖的隊列模型\x0d\x0a對於跨線程間的交互(用戶端和session)之間的數據交換通道pipe,採用無鎖的隊列算法CAS;在pipe兩端註冊有異步事件,在讀或者寫消息到pipe的時,會自動觸發讀寫事件。\x0d\x0a2、批量處理的算法\x0d\x0a對於傳統的消息處理,每個消息在發送和接收的時候,都需要系統的調用,這樣對於大量的消息,系統的開銷比較大,zeroMQ對於批量的消息,進行了適應性的優化,可以批量的接收和發送消息。\x0d\x0a3、多核下的線程綁定,無須CPU切換\x0d\x0a區別於傳統的多線程併發模式,信號量或者臨界區, zeroMQ充分利用多核的優勢,每個核綁定運行一個工作者線程,避免多線程之間的CPU切換開銷。\x0d\x0a5.4 Kafka\x0d\x0aKafka是一種高吞吐量的分布式發布訂閱消息系統,它可以處理消費者規模的網站中的所有動作流數據。 這種動作(網頁瀏覽,搜索和其他用戶的行動)是在現代網絡上的許多社會功能的一個關鍵因素。 這些數據通常是由於吞吐量的要求而通過處理日誌和日誌聚合來解決。 對於像Hadoop的一樣的日誌數據和離線分析系統,但又要求實時處理的限制,這是一個可行的解決方案。Kafka的目的是通過Hadoop的並行加載機制來統一線上和離線的消息處理,也是為了通過集群機來提供實時的消費。\x0d\x0aKafka是一種高吞吐量的分布式發布訂閱消息系統,有如下特性:\x0d\x0a通過O(1)的磁盤數據結構提供消息的持久化,這種結構對於即使數以TB的消息存儲也能夠保持長時間的穩定性能。(文件追加的方式寫入數據,過期的數據定期刪除)\x0d\x0a高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒數百萬的消息。\x0d\x0a支持通過Kafka服務器和消費機集群來分區消息。\x0d\x0a支持Hadoop並行數據加載。\x0d\x0aKafka相關概念\x0d\x0aBroker\x0d\x0aKafka集群包含一個或多個服務器,這種服務器被稱為broker[5]\x0d\x0aTopic\x0d\x0a每條發布到Kafka集群的消息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存於一個或多個broker上但用戶只需指定消息的Topic即可生產或消費數據而不必關心數據存於何處)\x0d\x0aPartition\x0d\x0aParition是物理上的概念,每個Topic包含一個或多個Partition.\x0d\x0aProducer\x0d\x0a負責發布消息到Kafka broker\x0d\x0aConsumer\x0d\x0a消息消費者,向Kafka broker讀取消息的客戶端。\x0d\x0aConsumer Group\x0d\x0a每個Consumer屬於一個特定的Consumer Group(可為每個Consumer指定group name,若不指定group name則屬於默認的group)。\x0d\x0a一般應用在大數據日誌處理或對實時性(少量延遲),可靠性(少量丟數據)要求稍低的場景使用。
4006869068 為什麼大型網站都是用PHP語言編寫?
個人理解主要原因如下:
(1)PHP全開源,開發網站有完整的組合配套.LAMP是很好的低成本解決方案.
(2)目前PHP在全球開發語言中排在前5名,使用者眾多,人才容易招聘.
(3)除了apache,開源的ngnix等高性web服務器大大提升了PHP的應用.
(4)已經比較成熟,而且效率很高.
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/280494.html