咨詢郵箱?咨詢郵箱:service@yitianxinda.com 咨詢熱線?咨詢熱線:18101296137 微博 微信
      軟件開發(fā)公司PHP應(yīng)用程序長時(shí)間使用的操作優(yōu)化的7種方式_北京軟件開發(fā)公司
      發(fā)表日期:2015-08-31 15:36:46 ?? 文章編輯:宜天信達(dá) ?? 瀏覽次數(shù):
      軟件開發(fā)公司7種方式的PHP應(yīng)用程序使用的長時(shí)間運(yùn)行的操作優(yōu)化
      照片史葛比爾
       
      今天我要談一談優(yōu)化長期運(yùn)行PHP操作基于較近的一個(gè)項(xiàng)目,我們已經(jīng)成功地完成了在這里的可能途徑azoft Web開發(fā)部門我們的經(jīng)驗(yàn)將有助于Web開發(fā)人員想要順利工作的PHP應(yīng)用程序即使任務(wù)是不斷發(fā)展變化的過程中。 
       
      本文沒有涵蓋所有可能的解決方案,它只是旨在概述選項(xiàng)可以使用面對長時(shí)間運(yùn)行的操作 問題,節(jié)省你的時(shí)間。
       
      項(xiàng)目概述
      以下技術(shù)進(jìn)行項(xiàng)目: 
       
      MVC框架CakePHP 2.1(PHP5.3)
      MySQL
      jQuery
      jQuery UI
      jQuery插件
      硒的服務(wù)器
      CentOS
      目標(biāo)
      的目標(biāo)是開發(fā)了一個(gè)原型一個(gè)系統(tǒng)的未來。事實(shí)上,這是一個(gè)試點(diǎn)項(xiàng)目,其規(guī)格和優(yōu)先發(fā)展過程中經(jīng)常改變。因?yàn)檫@個(gè)原因,它預(yù)測在早期階段,本項(xiàng)目系統(tǒng)將包含冗長的PHP操作相當(dāng)困難。 
       
      問題
      事實(shí)證明,這樣的操作導(dǎo)致在后來的發(fā)展階段的一個(gè)主要挑戰(zhàn):
       
      這樣長的操作阻塞其他操作在同一個(gè)會話。 
       
      通過系統(tǒng)鏈接導(dǎo)航整個(gè)過程變得不可能直到長操作完成。
       
      有了這些問題在一個(gè)較低的水平,我們發(fā)現(xiàn),直到操作完成和會話數(shù)據(jù)刷新到會話文件因此消除堵塞,所有其他的要求必須在排隊(duì)耐心等待。
       
      事實(shí)上,在PHP中存儲會話的默認(rèn)方法是在一個(gè)文件中存儲。當(dāng)一個(gè)會話打開的功能,如fopen()被激活,阻斷閱讀和其他進(jìn)程寫文件。
       
      的時(shí)候,請求和導(dǎo)航通過鏈接被封鎖期間,用戶不知道發(fā)生了什么的那一刻,當(dāng)操作就完了,是否有一些錯誤。
       
      解決這一問題的途徑
      1。將操作步驟
      第一個(gè)解決方案,可能會想到是將長到短的操作步驟。當(dāng)完成每一步并將結(jié)果傳送到用戶的瀏覽器,瀏覽器會自動啟動下一步,發(fā)送相應(yīng)的請求到服務(wù)器。
       
      在上下文中的特定的項(xiàng)目,這種方法并不成功,長期以來幾乎可分步驟操作。此外,在我們的項(xiàng)目中我們使用的第三方服務(wù)在服務(wù)器上運(yùn)行,工作,需要創(chuàng)建和編寫相應(yīng)的對象的請求處理期間。后處理的要求,通過對操作的第一步,該對象被殺。
       
      2。Ajax輪詢
      面對冗長的PHP操作的另一種方法是在服務(wù)器上啟動等操作不斷輪詢操作狀態(tài)更新服務(wù)器通過發(fā)送一系列的Ajax請求在一定的時(shí)間間隔。對于客戶端,我們可以分析服務(wù)器的響應(yīng)(例如這可能是JSON的“消息”,含有“百分比”,“錯誤”和“重定向”)并創(chuàng)建一個(gè)進(jìn)度條,顯示當(dāng)前操作的狀態(tài)。
       
      在我們的項(xiàng)目中,我們嘗試使用這種查詢方式采用兩種不同的方法來存儲和操作的結(jié)果:
       
      在一個(gè)文件中存儲結(jié)果< > + <運(yùn)行> session_id txt。
      在相應(yīng)的表格數(shù)據(jù)庫中存儲結(jié)果lengthy_operations
      用戶開始運(yùn)行Ajax請求。然后,客戶端腳本定期輪詢服務(wù)器并接收到更新當(dāng)前操作:
       
      view plaincopy to clipboardprint?
      <trans data-src="/operations/get_status/">/操作/ get_status /</trans><operation_id></operation_id>  
      然而,在這里我們遇到了另一個(gè)問題:當(dāng)冗長操作開始了會議文件,從而消除了處理并發(fā)請求的可能性在同一會話。換句話說,在漫長的手術(shù)開始了,應(yīng)該是被輪詢服務(wù)器必須在隊(duì)列中等待的主要要求是完成會話文件的請求。
       
      為了解決這個(gè)問題,我們的目標(biāo)是打開會話文件。為了做到這一點(diǎn),我們利用了一個(gè)PHP函數(shù)–session_write_close(),可以結(jié)束當(dāng)前會話和存儲會話數(shù)據(jù)。事實(shí)上,它是可能的發(fā)射操作,讀取會話的數(shù)據(jù),將數(shù)據(jù)更改,并禁用寫會話文件權(quán)限。
       
      然而,在實(shí)踐中,我們沒能為我們做的這個(gè)項(xiàng)目。考慮到現(xiàn)有的架構(gòu),有必要在冗長操作的地方太多的會議記錄。此外,這樣的解決方案不會被認(rèn)為是“干凈”的,因?yàn)橛脩艨赡芟霝g覽整個(gè)網(wǎng)站可能推出另一個(gè)耗時(shí)的操作在同一時(shí)間。因此,我們需要找到一個(gè)替代。
       
      另一種是改變會話存儲,允許使用會話沒有阻止它在打開。在選擇一個(gè)新的會話存儲,有幾個(gè)選項(xiàng):
       
      MySQL數(shù)據(jù)庫
      MongoDB
      memcached
      為了在PHP會話存儲變化,有設(shè)置會話存儲–會話的用戶函數(shù)的特殊功能。save_handler()。這些用戶的功能是用于存儲和檢索數(shù)據(jù),與會話相關(guān)聯(lián)的。事實(shí)上,功能save_handler()會話??梢杂迷谠S多不同的情況。有 甚至類可用于傳送會話到數(shù)據(jù)庫或緩存。
       
       
      而工作對我們的項(xiàng)目,我們嘗試用MySQL和MongoDB為會話存儲。
       
      注:讓我們說你記錄的參數(shù)到會話,你需要的是立即可用的其他要求。在這種情況下,你應(yīng)該“沖洗”會話到MySQL或MongoDB,因此讓會議記錄工作。要做到這一點(diǎn),你需要禁用編輯權(quán)限,然后重新打開它。
       
      會話存儲改變。無阻塞會話。
      從客戶端,Ajax請求開始啟動運(yùn)行。
      一系列的輪詢請求來更新狀態(tài)和進(jìn)度條。
      一個(gè)單獨(dú)的組件被創(chuàng)建的管理操作。
      3。長輪詢
      這種方法類似于Ajax輪詢,但有一個(gè)本質(zhì)的區(qū)別。在Ajax輪詢,客戶端輪詢服務(wù)器發(fā)現(xiàn)如果發(fā)生任何變化,但在長輪詢方式的服務(wù)器發(fā)送一個(gè)信號到客戶端時(shí)出現(xiàn)任何變化。這是說,長輪詢方式需要服務(wù)器和客戶端之間的Cф穩(wěn)定的網(wǎng)絡(luò)連接。這種方法的優(yōu)點(diǎn)是減少客戶端和服務(wù)器之間的流量。
       
      的工作原理。你可以這樣想:客戶端腳本調(diào)用服務(wù)器說,“如果數(shù)據(jù)出現(xiàn),我就可以把它從你的馬上,之后我再次與你聯(lián)系”。在一些服務(wù)器實(shí)現(xiàn)有緩沖當(dāng)服務(wù)器不給數(shù)據(jù)立即,等待,如果出現(xiàn)別的吧,我會把所有的數(shù)據(jù)一次”。然而,這樣的緩沖是有害的因?yàn)樗鼘?dǎo)致的延誤,我們想達(dá)到的較大速度!
       
      瀏覽器接收數(shù)據(jù)應(yīng)該再次打開新的連接之后。在理論上,這種連接可以持續(xù)幾個(gè)小時(shí)。但通常有更少的時(shí)間較多5分鐘之后,一個(gè)新的連接被創(chuàng)建。這樣做的原因是,服務(wù)器不喜歡持久的會議,和HTTP協(xié)議是不適合使用。
       
      對于我們的項(xiàng)目在手,我們認(rèn)為這種方法但沒有結(jié)束使用它。
       
      4。永遠(yuǎn)的iframe
      我們試著用這種方法在我們的項(xiàng)目。
       
      的工作原理。首先,我們應(yīng)該建立HTTP服務(wù)器和PHP,這樣他們就可以操作執(zhí)行時(shí)發(fā)送數(shù)據(jù)的部分。然后創(chuàng)建一個(gè)隱藏的iframe標(biāo)簽頁。標(biāo)簽將逐步呈現(xiàn)的信息或執(zhí)行操作的進(jìn)展。
       
      客戶端將使用iframe標(biāo)簽初始化操作。在服務(wù)器端的操作將數(shù)據(jù)部分和立即發(fā)送到iframe執(zhí)行發(fā)送響應(yīng)客戶端的響應(yīng)。
       
      5。流
      這是另一種方法,我們嘗試在我們的項(xiàng)目。
       
      這個(gè)想法是為了初始化操作通過Ajax請求,而服務(wù)器會在部分發(fā)送數(shù)據(jù),即數(shù)據(jù)流。這樣,接收數(shù)據(jù)部分后,它可能是一些事件可能在客戶端發(fā)生。使用這樣的事件,我們可以更新相應(yīng)的數(shù)據(jù)塊和數(shù)據(jù)加載顯示操作進(jìn)度。
       
      使用這種方法,首先我們需要在特定的方式設(shè)置Apache服務(wù)器、PHP。我們搜索了關(guān)于網(wǎng)絡(luò)設(shè)置的信息和使用前進(jìn)行一些測試。較后,設(shè)置如下:
       
       
      然后我們寫了一個(gè)組件,這種方法可能會使。
       
      更詳細(xì)的分析結(jié)果證明這種方法是不適合我們的特定項(xiàng)目后。這是事實(shí),有在客戶端可以對Ajax請求信號后接收數(shù)據(jù)的部分沒有事件,發(fā)送。這會在事件是在客戶端工作只有數(shù)據(jù)是完全作為一個(gè)整體。
       
      6。彗星服務(wù)器
      維基百科說,彗星是一個(gè)Web應(yīng)用程序模型中,長期持有的HTTP請求允許web服務(wù)器推送數(shù)據(jù)給瀏覽器,瀏覽器請求不明確。
       
      這種模型的一個(gè)共同的特點(diǎn),就是他們都不是基于專有插件,但通過瀏覽器直接支持的技術(shù),比如JavaScript。
       
      在這個(gè)項(xiàng)目中我們測試的dklab realplexor Comet服務(wù)器。
       
      下面是定義dklab realplexor將根據(jù)本項(xiàng)目的官方站點(diǎn)。
       
      dklab realplexor是彗星的服務(wù)器可以處理1000000 +并行長期持有的HTTP連接用戶的瀏覽器。在瀏覽器中運(yùn)行的JavaScript代碼在一個(gè)或幾個(gè)realplexor訂閱的渠道,建立一個(gè)數(shù)據(jù)接收處理程序。服務(wù)器可以在任何時(shí)候在這些渠道之一寫入消息。然后消息會立即傳遞給所有用戶–是否一個(gè)或在服務(wù)器上的較小負(fù)荷實(shí)時(shí)模式千。
       
      7。WebSockets
      我們還討論了使用WebSockets的可能性。
       
      維基百科說,WebSocket是Web技術(shù)在一個(gè)TCP連接提供全雙工通信信道。它是用于瀏覽器和Web服務(wù)器之間的實(shí)時(shí)信息交換。
       
      但我們拒絕了這個(gè)方法,它不是舊瀏覽器的兼容。
       
      總結(jié)
      因此,我們解決的問題,采用輪詢的方法傳遞會話MongoDB。
       
      然而,進(jìn)一步的討論和在長時(shí)間運(yùn)行的任務(wù)以及它們的復(fù)雜性導(dǎo)致了更多的標(biāo)準(zhǔn)和可靠的解決方案的使用量的增加:用cron執(zhí)行操作的隊(duì)列的實(shí)現(xiàn)(命令運(yùn)行)。
       
      事實(shí)上,在執(zhí)行操作后檢查我們可以序列化operationcontext并保存在數(shù)據(jù)庫中的所有權(quán)利:圖表cron_tasks。服務(wù)器將在特定的時(shí)間間隔運(yùn)行的cron的外殼,這將從隊(duì)列中取下一個(gè)任務(wù),改變其狀態(tài)in_progress遞給隨之而來的處理程序(taskdispatchercomponent)。該處理程序?qū)⑿蛄谢娜蝿?wù)上下文并執(zhí)行它在獨(dú)立的進(jìn)程。請注意,處理程序可以訪問所有的系統(tǒng)模型和組件。
       
      找出執(zhí)行任務(wù)的進(jìn)展,你可以使用Ajax輪詢和長輪詢,以及在一個(gè)單獨(dú)的顯示組織任務(wù)隊(duì)列的概述。這種方法已被軟件開發(fā)公司證明是較可靠的和可以理解的,盡管它需要一些變化的系統(tǒng)架構(gòu)。
      相關(guān)文章推薦
      業(yè)務(wù)增長每天都會帶來新的需求。無法跟上步伐?軟件解決方案可以為您解決。除了簡化管理流程,它還增加了你的投資回報(bào)率、安全性以及可擴(kuò)展性。此外,從長遠(yuǎn)來看,它還能顯...
      技術(shù)革命在全世界帶來了許多范式轉(zhuǎn)變。技術(shù)存在現(xiàn)已深深扎根于生活的幾乎每一個(gè)方面;隨著技術(shù)使用的增加,對離岸信息技術(shù)服務(wù)的需求也在增加。簡而言之,離岸信息技術(shù)服務(wù)...
      在不斷變化的網(wǎng)絡(luò)安全領(lǐng)域,包括信息安全分析人員和首席執(zhí)行官在內(nèi)的各個(gè)領(lǐng)域的IT專業(yè)人員面臨獨(dú)特的挑戰(zhàn)。從簡化安全調(diào)查問卷的回復(fù)到優(yōu)先考慮身份管理基礎(chǔ),我們編譯了...
      軟件開發(fā)是一個(gè)復(fù)雜的過程,涉及許多流程、組件和方法,它們必須協(xié)同工作才能成功。如果其中任何一個(gè)因素失敗,整個(gè)開發(fā)過程都可能受到阻礙。然而,在競爭激烈的生態(tài)系統(tǒng)中...
      下一代工業(yè)進(jìn)步被稱為工業(yè)4.0,旨在將傳統(tǒng)行業(yè)(如自動化)互聯(lián)互通并實(shí)現(xiàn)計(jì)算機(jī)化。工業(yè)4.0的目標(biāo)是使工廠變得更加智能,提高適應(yīng)性和資源效率,以及改善工廠之間供...
      您正在尋找能夠?qū)⒛钊梭@嘆的應(yīng)用程序想法變?yōu)楝F(xiàn)實(shí)的人。我應(yīng)該聘請軟件公司還是兼職開發(fā)者?這可能是每個(gè)新晉產(chǎn)品所有者問自己的最常見問題。在開始開發(fā)過程之前,您需要...
      北京軟件開發(fā)公司關(guān)于醫(yī)療移動解決方案...
      北京軟件開發(fā)公司滲透測試很有洞察力,但只能提供您安全狀況的短暫快照,使您的資產(chǎn)很容易受到未來的入侵。...
      企業(yè)和API經(jīng)濟(jì):MYOB的API戰(zhàn)略 會計(jì)軟件供應(yīng)商的API幫助IT服務(wù)新的觀眾 羅漢皮爾斯(計(jì)算機(jī)世界)打開(放)29九月, 電子郵件 應(yīng)用程序編程接口,是一種工具,幫助軟件開發(fā)。但據(jù)德...
      北京軟件開發(fā)32T塊存儲分區(qū)操作手冊,以下分別針對 Linux 和 Windows 的 ECS 實(shí)例來介紹大盤的管理和使用。 大數(shù)據(jù)盤的分區(qū)和文件系統(tǒng)格式化和小盤都存在差異。大盤必須采用 GPT 分區(qū)格...
      北京軟件開發(fā)公司關(guān)于金融信息系統(tǒng)...
      北京軟件開發(fā)公司隱私和安全是移動應(yīng)用程序開發(fā)人員的一個(gè)主要焦點(diǎn)...
      ?