利用WEB服務(wù)器本身的多線程來處理,從WEB服務(wù)器多次調(diào)用我們需要實現(xiàn)多線程的程序。
梧州網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、自適應網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)2013年開創(chuàng)至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
PHP中也能多線程了,那么問題也來了,那就是同步的問題。
廈門電腦培訓知道PHP本身是不支持多線程的,所以更不會有什么像Java中synchronize的方法了。
那我們該如何做呢?1.盡量不訪問同一個資源。
以避免沖突。
但是可以同時像數(shù)據(jù)庫操作。
因為數(shù)據(jù)庫是支持并發(fā)操作的。
所以在多線程的PHP中不要向同一個文件中寫入數(shù)據(jù)。
如果必須要寫的話,用別的方法進行同步。
如調(diào)用flock對文件進行加鎖等。
或建立臨時文件,并在另外的線程中等待這個文件的消失while(file_exits('xxx'));這樣就等于這個臨時文件存在時,表示其實線程正在操作。
如果沒有了這個文件,說明其它線程已經(jīng)釋放了這個。
2.盡量不要從runThread在執(zhí)行fputs后取這個socket中讀取數(shù)據(jù)。
因為要實現(xiàn)多線程,需要的用非阻塞模式。
即在像fgets這樣的函數(shù)時立即返回。
。
所以讀寫數(shù)據(jù)就會出問題。
如果使用阻塞模式的話,程序就不算是多線程了。
他要等上面的返回才執(zhí)行下面的程序。
所以如果需要交換數(shù)據(jù)最后利用外面文件或數(shù)據(jù)中完成。
實在想要的話就用socket_set_nonblock($fp)來實現(xiàn)。
說了這么多,倒底這個有沒有實際的意義呢?在什么時候需要這種用這種方法呢?答案是肯定的。
大家知道。
在一個不斷讀取網(wǎng)絡(luò)資源的應用中,網(wǎng)絡(luò)的速度是瓶頸。
如果采多這種形式就可以同時以多個線程對不同的頁面進行讀取。
curl是獲取數(shù)據(jù),它應該不關(guān)心數(shù)據(jù)是Json格式還是其它什么格式;而數(shù)據(jù)庫也不是認識json!
所有的格式轉(zhuǎn)換,你得通過php自己去完成!
我的情況和你類似,我這里是asp+access,php+mysql全能空間,先是在access里放了用戶信息,而后php需認證就通過ADO連access,但后來要求同時也要asp方面的認證,麻煩呀~~~~
后來有了一個折中的方案,用ajax(本人用的JQuery庫),用戶身份信息提交之后,先用ajax提交到php方審核,如通過,寫入授權(quán)cookie(用session應該也可以,PHP的和ASP得session不在一個地方放著),返回php方審核結(jié)果,客戶端收到php方審核結(jié)果后判斷,成功的話就繼續(xù)asp方審核,不成功的話提示錯誤,結(jié)束代碼。asp方也審核成功后,寫入session,返回客戶端,javascript跳轉(zhuǎn)到一個公用頁面,里面有asp方面也有php方面的鏈接,點任意一個都應該是授權(quán)過的,不用認證。
出此之外,之前我也考慮過用禎嵌套(iframe)傳值,但感覺如果是用戶信息的話,用get法傳值有些不太安全,并且用戶操作感會差一點。
只是個思路,是個山寨算法,希望各位大蝦們不要笑話啊~~~ 不過我個人感覺哦,還是java比較厲害哦,扮演著英語的角色,當兩個語言互不往來而需要交流的時候,客戶端的javascript就是最好的傳話筒~~~
php實現(xiàn)memcache緩存示例講解
共享內(nèi)存是一種在相同機器中的應用程序之間交換數(shù)據(jù)的有效方式,本文說的是php實現(xiàn)memcache緩存示例,大家參考使用吧
概述
共享內(nèi)存是一種在相同機器中的應用程序之間交換數(shù)據(jù)的有效方式。一個進程可創(chuàng)建一個可供其他進程訪問的內(nèi)存段,只要它分配了正確的權(quán)限。每個內(nèi)存段擁有一個惟一的 ID(稱為 shmid),這個 ID 指向一個物理內(nèi)存區(qū)域,其他進程可在該區(qū)域操作它。創(chuàng)建并提供了合適的權(quán)限之后,同一臺機器中的其他進程就可以操作這些內(nèi)存段:讀取、寫入和刪除。
這表明使用 C 語言編寫的應用程序可與使用其他語言(比如 Java? 或 PHP)編寫的應用程序共享信息。它們都可以共享信息,只要它們可訪問和理解該信息。共享內(nèi)存在針對大部分語言的實現(xiàn)中得到了廣泛使用,所以訪問應該不是問題。要理解信息,我們可以使用一種標準格式,比如 XML 或 JSON。
共享內(nèi)存的使用是一種在進程之間交換數(shù)據(jù)的快速方法,主要因為在創(chuàng)建內(nèi)存段之后傳遞數(shù)據(jù),不會涉及內(nèi)核。這種方法常常稱為進程間通信 (IPC)。其他 IPC 方法包括管道、消息隊列、RPC 和套接字。當使用需要彼此通信的應用程序的生態(tài)系統(tǒng)時,這種在應用程序之間快速、可靠地交換數(shù)據(jù)的能力非常有用。取決于生態(tài)系統(tǒng)的大小,使用數(shù)據(jù)庫在應用程序之間交換信息的常用方法常常會導致查詢緩慢,甚至 I/O 阻塞。使用共享內(nèi)存,沒有 I/O 會減緩開發(fā)人員的進度。
本文的提議非常簡單,學習如何使用 PHP 創(chuàng)建和操作共享內(nèi)存段,使用它們存儲可供其他應用程序使用的數(shù)據(jù)集。即使沒有使用共享內(nèi)存交換數(shù)據(jù)的計劃,它本身也在許多好處,因為它使應用程序能夠遠離 I/O 問題。將數(shù)據(jù)集直接存儲在內(nèi)存中具有諸多優(yōu)勢,從 Web 服務(wù)數(shù)據(jù)緩存到會話共享。它是一個非常有用的概念,每個 PHP 開發(fā)人員都應該知道。
共享內(nèi)存和 PHP
PHP 擁有豐富的可用擴展,共享內(nèi)存也一樣。使用一些共享的函數(shù),無需安裝任何擴展,開發(fā)人員就能夠輕松操作內(nèi)存段。
創(chuàng)建內(nèi)存段
共享內(nèi)存函數(shù)類似于文件操作函數(shù),但無需處理一個流,您將處理一個共享內(nèi)存訪問 ID。第一個示例就是 shmop_open 函數(shù),它允許您打開一個現(xiàn)有的內(nèi)存段或創(chuàng)建一個新內(nèi)存段。此函數(shù)非常類似于經(jīng)典的 fopen 函數(shù),后者打開用于文件操作的流,返回一個資源供其他希望讀取或?qū)懭朐摯蜷_的流的函數(shù)使用。讓我們看看清單 1 中的 shmop_open。
清單 1. shmop_open 函數(shù)
復制代碼代碼如下:
?php
$systemid = 864; // System ID for the shared memory segment
$mode = "c"; // Access mode
$permissions = 0755; // Permissions for the shared memory segment
$size = 1024; // Size, in bytes, of the segment
$shmid = shmop_open($systemid, $mode, $permissions, $size);
?
該函數(shù)中出現(xiàn)的第一個事物是系統(tǒng) ID 參數(shù)。這是標識系統(tǒng)中的共享內(nèi)存段的數(shù)字。第二個參數(shù)是訪問模式,它非常類似于 fopen 函數(shù)的訪問模式。您可以在 4 種不同的模式下訪問一個內(nèi)存段:
?模式 “a”,它允許您訪問只讀內(nèi)存段
?模式 “w”,它允許您訪問可讀寫的內(nèi)存段
?模式 “c”,它創(chuàng)建一個新內(nèi)存段,或者如果該內(nèi)存段已存在,嘗試打開它進行讀寫
?模式 “n”,它創(chuàng)建一個新內(nèi)存段,如果該內(nèi)存段已存在,則會失敗
第三個參數(shù)是內(nèi)存段的權(quán)限。您必須在這里提供一個八進制值。
第四個參數(shù)提供內(nèi)存段大小,以字節(jié)為單位。在寫入一個內(nèi)存段之前,您必須在它之上分配適當?shù)淖止?jié)數(shù)。
請注意,此函數(shù)返回一個 ID 編號,其他函數(shù)可使用該 ID 編號操作該共享內(nèi)存段。這個 ID 是共享內(nèi)存訪問 ID,與系統(tǒng) ID 不同,它以參數(shù)的形式傳遞。請注意不要混淆這兩者。如果失敗,shmop_open 將返回 FALSE。
向內(nèi)存段寫入數(shù)據(jù)
使用 shmop_write 函數(shù)向共享內(nèi)存塊寫入數(shù)據(jù)。此函數(shù)的使用很簡單,它僅接受 3 個參數(shù),如清單 2 所示。
清單 2. 使用 shmop_write 向共享內(nèi)存塊寫入數(shù)據(jù)
復制代碼代碼如下:
?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
?
這個函數(shù)類似于 fwrite 函數(shù),后者有兩個參數(shù):打開的流資源(由 fopen 返回)和您希望寫入的數(shù)據(jù)。shmop_write 函數(shù)也執(zhí)行此任務(wù)。
第一個參數(shù)是 shmop_open 返回的 ID,它識別您操作的共享內(nèi)存塊。第二個參數(shù)是您希望存儲的數(shù)據(jù),最后的第三個參數(shù)是您希望開始寫入的位置。默認情況下,我們始終使用 0 來表示開始寫入的位置。請注意,此函數(shù)在失敗時會返回 FALSE,在成功時會返回寫入的字節(jié)數(shù)。
從內(nèi)存段讀取數(shù)據(jù)
從共享內(nèi)存段讀取數(shù)據(jù)很簡單。您只需要一個打開的內(nèi)存段和 shmop_read 函數(shù)。此函數(shù)接受一些參數(shù),工作原理類似于 fread。參見清單 3,讀取一個 PHP 文件的內(nèi)容。
清單 3. 使用 shmop_read 讀取一個文件的內(nèi)容
復制代碼代碼如下:
?php
$stream = fopen('file.txt', 'r+');
fwrite($stream, "Hello World!");
echo fread($stream, 11);
?
讀取共享內(nèi)存段的內(nèi)容的過程與此類似,如清單 4 所示:
清單 4. 讀取共享內(nèi)存段的內(nèi)容
復制代碼代碼如下:
?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
echo shmop_read($shmid, 0, 11);
?
請留意這里的參數(shù)。shmop_read 函數(shù)將接受 shmop_open 返回的 ID,我們已知道它,不過它還接受另外兩個參數(shù)。第二個參數(shù)是您希望從內(nèi)存段讀取的位置,而第三個是您希望讀取的字節(jié)數(shù)。第二個參數(shù)可以始終為 0,表示數(shù)據(jù)的開頭,但第三個參數(shù)可能存在問題,因為我們不知道我們希望讀取多少字節(jié)。
這非常類似于我們在 fread 函數(shù)中的行為,該函數(shù)接受兩個參數(shù):打開的流資源(由 fopen 返回)和您希望從該流讀取的字節(jié)數(shù)。使用filesize 函數(shù)(它返回一個文件中的字節(jié)數(shù))來完整地讀取它。
幸運的是,當使用共享內(nèi)存段時,shmop_size 函數(shù)返回一個內(nèi)存段的大?。ㄒ宰止?jié)為單位),類似于 filesize 函數(shù)。參見清單 5。
清單 5. shmop_size 函數(shù)返回內(nèi)存段大小,以字節(jié)為單位
復制代碼代碼如下:
?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
$size = shmop_size($shmid);
echo shmop_read($shmid, 0, $size);
?
回頁首
刪除內(nèi)存段
我們學習了如何打開、寫入和讀取共享內(nèi)存段。要完成我們的 CRUD 類,我們還需要學習如何刪除內(nèi)存段。該任務(wù)可使用 shmop_delete 函數(shù)輕松完成,該函數(shù)僅接受一個參數(shù):我們希望刪除的共享內(nèi)存 ID。
清單 6. shmop_delete 標記要刪除的內(nèi)存段
復制代碼代碼如下:
?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
shmop_delete($shmid);
?
這不會實際刪除該內(nèi)存段。它將該內(nèi)存段標記為刪除,因為共享內(nèi)存段在有其他進程正在使用它時無法被刪除。shmop_delete 函數(shù)將該內(nèi)存段標記為刪除,阻止任何其他進程打開它。要刪除它,我們需要關(guān)閉該內(nèi)存段。
關(guān)閉內(nèi)存段
打開一個共享內(nèi)存段會 “附加” 到它。附加該內(nèi)存段之后,我們可在其中進行讀取和寫入,但完成操作后,我們必須從它解除。這使用清單 7 中的 shmop_close 函數(shù)來完成。
這非常類似于處理文件時的 fclose 函數(shù)。打開包含一個文件的流并在其中讀取或?qū)懭霐?shù)據(jù)后,我們必須關(guān)閉它,否則將發(fā)生鎖定。
清單 7. 使用 shmop_close 與一個內(nèi)存段分開
復制代碼代碼如下:
?php
$shmid = shmop_open(864, 'c', 0755, 1024);
shmop_write($shmid, "Hello World!", 0);
shmop_delete($shmid);
shmop_close($shmid);
?
使用共享內(nèi)存作為一個存儲選項
有了共享內(nèi)存和共享內(nèi)存段上基本 CRUD 操作的基本知識,是時候應用此知識了。我們可以使用共享內(nèi)存作為一種獨特的存儲選項,提供快速讀/寫操作和進程互操作性等優(yōu)勢。對于 Web 應用程序,這意味著:
?緩存存儲(數(shù)據(jù)庫查詢、Web 服務(wù)數(shù)據(jù)、外部數(shù)據(jù))
?會話存儲
?應用程序之間的數(shù)據(jù)交換
在繼續(xù)之前,我想介紹一個名為 SimpleSHM 小型庫。SimpleSHM 是一個較小的抽象層,用于使用 PHP 操作共享內(nèi)存,支持以一種面向?qū)ο蟮姆绞捷p松操作內(nèi)存段。在編寫使用共享內(nèi)存進行存儲的小型應用程序時,這個庫可幫助創(chuàng)建非常簡潔的代碼。要了解 SimpleSHM,請訪問GitHub 頁面。
您可以使用 3 個方法進行處理:讀、寫和刪除。從該類中簡單地實例化一個對象,可以控制打開的共享內(nèi)存段。清單 8 展示了基本用途。
清單 8. SimpleSHM 基本用途
復制代碼代碼如下:
?php
$memory = new SimpleSHM;
$memory-write('Sample');
echo $memory-read();
?
請注意,這里沒有為該類傳遞一個 ID。如果沒有傳遞 ID,它將隨機選擇一個編號并打開該編號的新內(nèi)存段。我們可以以參數(shù)的形式傳遞一個編號,供構(gòu)造函數(shù)打開現(xiàn)有的內(nèi)存段,或者創(chuàng)建一個具有特定 ID 的內(nèi)存段,如清單 9 所示。
清單 9. 打開一個特定的內(nèi)存段
復制代碼代碼如下:
?php
$new = new SimpleSHM(897);
$new-write('Sample');
echo $new-read();
?
神奇的方法 __destructor 負責在該內(nèi)存段上調(diào)用 shmop_close 來取消設(shè)置對象,以與該內(nèi)存段分離。我們將這稱為 “SimpleSHM 101”?,F(xiàn)在讓我們將此方法用于更高級的用途:使用共享內(nèi)存作為存儲。存儲數(shù)據(jù)集需要序列化,因為數(shù)組或?qū)ο鬅o法存儲在內(nèi)存中。盡管這里使用了 JSON 來序列化,但任何其他方法(比如 XML 或內(nèi)置的 PHP 序列化功能)也已足夠。清單 10 給出了一個示例。
清單 10. 使用共享內(nèi)存作為存儲
復制代碼代碼如下:
?php
require('SimpleSHM.class.php');
$results = array(
'user' = 'John',
'password' = '123456',
'posts' = array('My name is John', 'My name is not John')
);
$data = json_encode($results);
$memory = new SimpleSHM;
$memory-write($data);
$storedarray = json_decode($memory-read());
print_r($storedarray);
?
我們成功地將一個數(shù)組序列化為一個 JSON 字符串,將它存儲在共享內(nèi)存塊中,從中讀取數(shù)據(jù),去序列化 JSON 字符串,并顯示存儲的數(shù)組。這看起來很簡單,但請想象一下這個代碼片段帶來的可能性。您可以使用它存儲 Web 服務(wù)請求、數(shù)據(jù)庫查詢或者甚至模板引擎緩存的結(jié)果。在內(nèi)存中讀取和寫入將帶來比在磁盤中讀取和寫入更高的性能。
使用此存儲技術(shù)不僅對緩存有用,也對應用程序之間的數(shù)據(jù)交換也有用,只要數(shù)據(jù)以兩端都可讀的格式存儲。不要低估共享內(nèi)存在 Web 應用程序中的力量。可采用許多不同的方式來巧妙地實現(xiàn)這種存儲,惟一的限制是開發(fā)人員的創(chuàng)造力和技能
你先告訴我你要交換些什么數(shù)據(jù)嘛
請看這個例子:
幾個人要共用一段數(shù)據(jù):
Mysql數(shù)據(jù)表:share
字段:id,value
這樣一設(shè)計你就可以用ID來獲得一段數(shù)據(jù)
假設(shè)id=5 那么你就在每個用戶里面都用select * from share where id=5
就可以查詢獲得這個公共數(shù)據(jù)了,如果想每個人都更改那么你可以用update share set value=*** where id=5
當然最好不好讓每個人都可以delete,否則其它用戶可能因查詢不到數(shù)據(jù)而出錯。
手機app獲取遠程數(shù)據(jù)的方式類似于web的ajax技術(shù),是異步向一個URL發(fā)起HTTP請求
一個URL地址對應一個數(shù)據(jù)源
這一個一個地址被俗稱內(nèi)容提供者的API
其實PHP是直接返回的數(shù)據(jù)呀,就是叫做API而已