PHPÖÐʵÏÖ½ø³Ì¼äͨѶ

5年以前  |  阅读数:434 次  |  编程语言:PHP 

PHPÖÐʵÏÖ½ø³Ì¼aͨѶ

ÇñÎÄÓi

±¾ÎĽ«ÌÖÂÛÔÚPHP4»¾³ÏÂÈçºÎʹÓýø³Ì¼aͨѶ»uÖÆ¡ª¡ªIPC(Inter-Process-Communication)¡£±¾ÎÄÌÖÂÛµÄÈi¼þ»¾³ÊÇlinux+php4.0.4»o¸u¸ß°ae±¾¡£Ê×ÏÈ,ÎÒÃǼÙÉeÄaÒѾ­×°ºÃÁËPHP4ºÍUNIX, ΪÁËʹµÃphp4¿ÉÒÔʹÓù²ÏiÄÚ´aeºÍÐźÅÁ¿£¬±ØÐeÔÚ±aÒephp4³ÌÐoʱ¼¤»ishmopºÍsysvsemÕaÁ½¸oÀ(C)չģ¿e¡£
ʵÏÖ½¨£ºÔÚPHPÉe¶¨(configure)ʱ¼ÓÈeÈçÏÂÑ¡Ïi¡£
--enable-shmop --enable-sysvsem
ÕaÑu¾ÍʹµÃÄaµÄPHPϵͳ¿ÉÒÔ´¦ÀiÏa¹ØµÄIPCº¯ÊýÁË¡£
IPCÊÇʲô£¿
IPC (Inter-process communication) ÊÇÒ»¸oUnix±e׼ͨѶ»uÖÆ£¬ËuÌa¹(C)ÁËʹµÃÔÚͬһ̨Ö÷»u²»Í¬½ø³ÌÖ®¼a¿ÉÒÔ»¥ÏaͨѶµÄ½¨¡£»u±¾µÄIPC´¦Ài»uÖÆÓÐ3ÖÖ£ºËuÃÇÖ±ðÊǹ²ÏiÄÚ´ae¡¢ÐźÅÁ¿ºÍÏuÏ¢¶ÓÁС£±¾ÎÄÖÐÎÒÃÇÖ÷ÒªÌÖÂÛ¹²ÏiÄÚ´aeºÍÐźÅÁ¿µÄʹÓ᣹ØÓÚÏuÏ¢¶ÓÁУ¬±ÊÕßÔÚ²»¾ÃµÄ½«À´»¹»aרÃŽeÉÜ¡£
ÔÚPHPÖÐʹÓù²ÏiÄÚ´ae¶Î
ÔÚ²»Í¬µÄ´¦Ài½ø³ÌÖ®¼aʹÓù²ÏiÄÚ´aeÊÇÒ»¸oʵÏÖ²»Í¬½ø³ÌÖ®¼aÏa»¥Í¨Ñ¶µÄºÃ
½¨¡£Èç¹uÄaÔÚÒ»¸o½ø³ÌÖÐÏoËu¹²ÏiµÄÄÚ´aeдÈeÒ»¶ÎÐÅÏ¢£¬ÄÇôËuÓÐÆaËuµÄ½ø³ÌÒ²¿ÉÒÔ¿´µ½Õa¶Î±»Ð´ÈeµÄÊý¾Ý¡£Ç³£½±a¡£ÔÚPHPÖÐÓÐÁ˹²ÏiÄÚ´aeµÄ°iÖu£¬Äa¿ÉÒÔʵÏÖ²»Í¬½ø³ÌÔÚÔËÐÐͬһ¶ÎPHP½Å±¾Ê±µ»Ø²»Í¬µÄ½a¹u¡£»oʵÏÖ¶ÔPHPͬʱÔËÐÐÊýÁ¿µÄʵʱ²eѯµÈµÈ¡£
¹²ÏiÄÚ´aeÔÊÐiÁ½¸o»oÕ߶a¸o½ø³Ì¹²ÏiÒ»¸ø¶¨µÄ´ae´¢Çø¡£ÒoΪÊý¾Ý²»ÐeÒªÔÚ¿Í»§»uºÍþÎñÆ÷Ö®¼a¸´ÖÆ£¬ËuÒÔÕaÊÇ×i¿iµÄÒ»ÖÖIPC¡£Ê¹Óù²ÏiÄÚ´aeµÄΨһÇÏÃÅÊǶa¸o½ø³Ì¶ÔÒ»¸ø¶¨´ae´¢ÇøµÄͬ²½´aeÈ¡¡£
ÈçºÎ½¨Á¢Ò»¸o¹²ÏiÄÚ´ae¶ÎÄØ£¿ÏÂÃaeµÄ´uÂe¿ÉÒÔ°iÄa½¨Á¢¹²ÏiÄÚ´ae¡£
$shm_id = shmop_open($key, $mode, $perm, $size);
×¢Òa£¬Ã¿¸o¹²ÏiÄÚ´ae¶Î¶¼ÓÐÒ»¸oΨһµÄID, ÔÚPHPÖУ¬shmop_open»a°Ñ½¨Á¢ºÃµÄ¹²ÏiÄÚ´ae¶ÎµÄID
µ»Ø£¬ÕaÀiÎÒÃÇÓÃ$shm_id¼Ç¼Ëu¡£¶ø$keyÊÇÒ»¸oÎÒÃÇÂß¼­Éϱiʾ¹²ÏiÄÚ´ae¶ÎµÄKeyÖµ¡£²»Í¬½ø³ÌֻҪѡÔñͬһ¸oKey id¾Í¿ÉÒÔ¹²Ïiͬһ¶Î´ae´¢¶Î¡£Ï°¹ßÉÏÎÒÃÇÓÃÒ»¸o´®£¨ÀaËÆÎļþÃuÒ»ÑuµÄ¶«Î÷£(C)µÄÉ¢ÁÐÖµ×÷Ϊkey id. $modeÖ¸Ã÷Á˹²ÏiÄÚ´ae¶ÎµÄʹÓýʽ¡£ÕaÀiÓÉÓÚÊÇн¨£¬Òo´ËֵΪ'c' ¨CÈ¡createÖ®Òa¡£Èç¹uÄaÊÇÃÎÊÒѾ­½¨Á¢¹ýµÄ¹²ÏiÄÚ´aeÄÇôÇeÓÃ'a',-- È¡accessÖ®Òa¡£$perm²ÎÊý¶¨ÒaÁËÃÎʵÄȨÏÞ£¬8½øÖÆ£¬¹ØÓÚȨÏÞ¶¨ÒaÇe¿´UNIXÎļþϵͳ°iÖu¡£$size¶¨ÒaÁ˹²ÏiÄÚ´aeµÄ´oС¡£¾¡¹ÜÓеaÏofopen(Îļþ´¦Ài)Äa¿É²»Òªµ±ËuͬÎļþ´¦ÀiÒ»Ñu¡£ºoÃaeµÄÃeÊoÄa½«¿´µ½×ÅÒ»µa¡£
ÀýÈ磺
$shm_id = shmop_open(0xff3, "c", 0644, 100);
ÕaÀiÎÒÃÇ´o¿ªÁËÒ»¸o¹²ÏiÄÚ´ae¶Î ¼uÖµ0xff3 ¨Crw-r¡ªr¡ª¸ñʽ£¬´oСΪ100×Ö½Ú¡£
Èç¹uÐeÒª
ÃÎÊÒÑÓеĹ²ÏiÄÚ´ae¶Î£¬Äa±ØÐeÔÚµ÷ÓÃshmop_openÖÐÉeµÚ3¡¢4¸o²ÎÊýΪ0¡£
IPC¹¤×÷״̬µÄ²eѯ
ÔÚUnixÏ£¬Äa¿ÉÒÔÓÃÒ»¸oÃuÁiÐгÌÐoipcs²eѯϵͳËuÓеÄIPC×ÊԴ״̬¡£²»¹ýÓÐÐ(C)ϵͳҪÇoÐeÒª³¬¼¶Óû§*½ÄÜÖ´ÐС£ÏÂͼÊÇÒ»¶ÎipcsµÄÔËÐнa¹u¡£

ÉÏͼÖÐϵͳÏÔʾÁË4¸o¹²ÏiÄÚ´ae¶Î£¬×¢ÒaÆaÖеÚ4¸o¼uֵΪ0x00000ff3µÄ¾ÍÊÇÎÒÃǸոÕÔËÐйýµÄPHP³ÌÐoËu´´½¨µÄ¡£¹ØÓÚipcsµÄÓèÇe²Î¿¼UNIXÓû§ÊÖ²a¡£
ÈçºÎÊÍ
Ź²ÏiÄÚ´aeÄØ
ÊÍŹ²ÏiÄÚ´aeµÄ°i¨Êǵ÷ÓÃPHPÖ¸Ái:shmop_delete($id)
shmop_delete($id);
$id ¾ÍÊÇÄaµ÷ÓÃshmop_openËu´aeµÄshmop_opµÄµ»ØÖµ¡£»¹ÓÐÒ»¸o°i¨¾ÍÊÇÓÃUNIXµÄ¹ÜÀiÖ¸Ái:
ipcrm id, id¾ÍÊÇÄaÓÃipcs¿´µ½µÄID.ºÍÄa³ÌÐoÖеÄ$id²»Ò»Ñu¡£²»¹ýҪСÐÄ£¬Èç¹uÄaÓÃipcrmÖ±½Óɾ³ý¹²ÏiÄÚ´ae¶ÎÄÇôÓпÉÄܵ¼ÖÂÆaËu²»ÖªµÀÕaÒ»Çe¿oµÄ½ø³ÌÔÚÒýÓÃÕa¸oÒѾ­²»¸´´aeÔڵĹ²ÏiÄÚ´aeÆ÷ʱ³oÏÖÒ»Ð(C)²»¿ÉÔ¤²aµÄ´iÎo(ÍuÍu½a¹u²»Ãi)¡£
ÈçºÎʹÓÃ(¶Áд)¹²ÏiÄÚ´aeÄØ
ʹÓÃÈçÏÂËuʾº¯ÊýÏo¹²ÏiÄÚ´aeдÈeÊý¾Ý
int shmop_write (int shmid, string data, int offset)
ÆaÖÐshmidÊÇÓÃshmop_openµ»ØµÄ¾a±u¡£$Data±aÁ¿´aeÅÁËÒª´aeŵÄÊý¾Ý¡£$offsetÃeÊoÁËдÈe´Ó¹²ÏiÄÚ´aeµÄ¿ªÊ¼µÚÒ»¸o×Ö½ÚµÄλÖã¨ÒÔ0¿ªÊ¼£(C)¡£
¶ÁÈ¡²Ù×÷ÊÇ£º
string shmop_read (int shmid, int start, int count)
ͬÑu£¬Ö¸Ã÷$shmid,¿ªÊ¼Æ«ÒÆÁ¿£¨ÒÔ0¿ªÊ¼£(C)¡¢×ܶÁÈ¡ÊýÁ¿¡£
µ»Ø½a¹u´®¡£ÕaÑu£¬Äa¾Í¿ÉÒ԰ѹ²ÏiÄÚ´ae¶Îµ±×÷ÊÇÒ»¸o×Ö½ÚÊý×e¡£¶Á¼¸¸oÔÙд¼¸¸o£¬Ïe¸ÉÂi¾Í¸ÉÂi£¬Ê®Ö½±a¡£
¶a½ø³ÌÎÊÌaµÄ¿¼ÂÇ
ÏÖÔÚ£¬ÔÚµ¥¶ÀµÄÒ»«µÃµ½Ò»¸o´iÎoµÄÊý¾Ý£¬ÒoΪ¸Ã¶ÎÄÚ´ae½«Ö®¿ÉÄÜÊÇ×iºoÖ´ÐеĽø³ÌµÄÄÚÈÝ£¬ÉoÖÁÊÇÓ?¸o½ø³ÌдÈeµÄÊý¾ÝÂÖÁ÷Ëae»u³oÏÖµÄÒ»¶Î»iºÏµÄËIJ»Ïo¡£ÕaÏÔÈ»ÊDz»ÄܽÓÊܵġ£ÎªÁ˽a¾oÕa¸oÎÊÌa£¬ÎÒÃDZØÐeÒýÈe»¥³a»uÖÆ¡£»¥³a»uÖÆÔںܶa²Ù×÷ϵͳµÄ½Ì²ÄÉ϶¼ÓÐרÃŽ²Êo£¬ÕaÀi²»¶aÖظ´¡£ÊµÏÖ»¥³a»uÖƵÄ×i¼oµ¥°i¨¾ÍÊÇʹÓÃÐźŵơ£ÐźÅÁ¿ÊÇÁiÍaÒ»ÖÖ½ø³Ì¼aͨѶ(IPC)µÄ½Ê½£¬ËuͬÆaËuIPC»u¹¹(¹ÜµÀ¡¢FIFO¡¢ÏuÏ¢¶ÓÁÐ)²»Í¬¡£ËuÊÇÒ»¸o¼ÇÊýÆ÷£¬ÓÃÓÚ¿ØÖƶa½ø³Ì¶Ô¹²ÏiÊý¾ÝµÄ´ae´¢¡£Í¬ÑuµÄÊÇÄa¿ÉÒÔÓÃipcsºÍipcrmʵÏÖ¶ÔÐźŵÆʹÓÃ״̬µÄ²eѯºÍ¶ÔÆaʵÏÖɾ³ý²Ù×÷¡£ÔÚPHPÖÐÄa¿ÉÒÔÓÃÏÂÁк¯Êý´´½¨Ò»¸oеÄÐźÅÁ¿²¢µ»Ø²Ù×÷¸ÃÐźÅÁ¿µÄ¾a±u¡£Èç¹u¸ÃkeyÖ¸ÏoµÄÐźÅÁ¿ÒѾ­´aeÔÚ£¬sem_getÖ±½Óµ»Ø²Ù×÷¸ÃÐźÅÁ¿µÄ¾a±u¡£
int sem_get (int key [, int max_acquire ][, int perm]])
$max_acquire Ö¸Ã÷ͬʱ×i¶a¿ÉÒÔÓü¸¸o½ø³Ì½øÈe¸ÃÐźŶø²»±ØµÈ´ý¸ÃÐźű»ÊÍÅ£¨Ò²¾ÍÊÇ×i´oͬʱ´¦Àiijһ×ÊÔ´µÄ½ø³ÌÊýÄ¿,Ò»°a¸ÃÖµ¾uΪһ£(C)¡£$permÖ¸Ã÷ÁËÃÎÊȨÏÞ¡£
Ò»µ(C)Äa³É¹¦µÄÓµÓÐÁËÒ»¸oÐźÅÁ¿£¬Äa¶ÔËuËuÄÜ×oµÄÖ»ÓÐ2ÖÖ£ºÇeÇo¡¢ÊÍÅ¡£µ±ÄaÖ´ÐÐÊÍŲÙ×÷ʱ, ϵͳ½«°Ñ¸ÃÐźÅÖµ¼oÒ»¡£Èç¹uСÓÚ0ÄǾͻ¹ÉeΪ0¡£¶øµ±ÄaÖ´ÐÐÇeÇo²Ù×÷ʱ£¬ÏµÍ³½«°Ñ¸ÃÐźÅÖµ¼ÓÒ»£¬Èç¹u¸ÃÖµ´oÓÚÉe¶¨µÄ×i´oÖµÄÇôϵͳ½«¹ÒÆðÄaµÄ´¦Ài½ø³ÌÖ±µ½ÆaËu½ø³ÌÊÍŵ½Ð¡ÓÚ×i´oֵΪֹ¡£Ò»°aÇe¿oÏÂ×i´oÖµÉeΪ1,ÕaÑuÒ»À´µ±Ò»¸o½ø³Ì»ñµÃÇeÇoʱÆaËuºoÃaeµÄ½ø³ÌÖ»ÄܵȴýËuÍ˳o»¥³aÇøºoÊÍÅÐźÅÁ¿²ÅÄܽøÈe¸Ã»¥³aÇø²¢Í¬Ê±ÉeΪ¶ÀÕ¼½Ê½¡£ÕaÑuµÄÐźÅÁ¿³£³ÆΪ˫̬ÐźÅÁ¿¡£µ±È»£¬Èç¹u³oÖµÊÇÈÎÒaÒ»¸oÕýÊý¾Í±iÃ÷ÓжaÉÙ¸o¹²Ïi×ÊÔ´µ¥Î»¿É¹(C)¹²ÏiÓ¦Óá£
ÉeÇe¡¢ÊÍ
ŲÙ×÷µÄPHP¸ñʽÈçÏ£º
int sem_acquire (int sem_identifier) ÉeÇe
int sem_release (int sem_identifier) ÊÍÅ
ÆaÖÐsem_identifierÊǵ÷ÓÃsem_getµÄ
µ»ØÖµ£¨¾a±u£(C)¡£
Ò»¸o¼oµ¥µÄ»¥³aЭÒeÀý×Ó
ÏÂÃaeÊÇÒ»¶ÎºÜ¼oµ¥µÄ»¥³a²Ù×÷¹ae³Ì¡£
$semid=sem_get(0xee3,1,0666);
$shm_id = shmop_open(0xff3, "c", 0644, 100);
sem_acquire($semid);£ £ £ £ £ //ÉeÇe
/ ½øÈeÁÙ½çÇø/
£ £ ÕaÀi£¬¶Ô¹²ÏiÄÚ´ae½øÐд¦Ài
sem_release($semid); £ £ £ £ £ //ÊÍÅ
ÕýÈçÄaËu¿´µ½µÄ£¬»¥³aµÄʵÏֺܼoµ¥£ºÉeÇe½øÈeÁÙ½çÇø£¬¶ÔÁÙ½çÇø×ÊÔ´½øÐвÙ×÷£¨±ÈÈçÐ޸Ĺ²ÏiÄÚ´ae£(C)Í˳oÁÙ½çÇø²¢ÊÍ
ÅÐźš£ÕaÑuÒ»À´¾Í¿ÉÒÔ±£Ö¤ÔÚͬһ¸oʱ¼aƬÖв»¿ÉÄÜÓÐͬʱ2¸o½ø³Ì¶Ôͬһ¶Î¹²ÏiÄÚ´ae½øÐвÙ×÷¡£ÒoΪÐźÅÁ¿»uÖƱ£Ö¤Ò»¸oʱ¼aƬֻÄÜÓÉÒ»¸o½ø³Ì½øÈe£¬ÆaËu½ø³Ì±ØÐeµÈ´ýµ±Ç°´¦ÀiµÄ½ø³ÌÍe³Éºo½ÄܽøÈe¡£
ÁÙ½çÇøÒ»°aÊÇÖ¸ÄÇÐ(C)²»ÔÊÐiͬʱÓжa¸o½ø³Ì²¢
¢´¦ÀiµÄ´uÂe¶Î¡£
ҪעÒaµÄÊÇ:ÔÚPHPÖбØÐeÓÉͬһ¸o½ø³ÌÊÍÅËuËuÕ¼ÓõÄÐźÅÁ¿¡£ÔÚÒ»°aϵͳÖÐÔÊÐi½ø³ÌÊÍűðµÄ½ø³ÌÕ¼ÓõÄÐźš£ÔÚ±aдÁÙ½çÇø´uÂeÒ»¶¨ÒªÐ¡ÐÄÉe¼Æ×ÊÔ´µÄÖÅa£¬±ÜÃaAµÈB£¬BµÈAµÄËÀËøÇe¿o¢Éu¡£
ÔË£ ÓÃ
IPCµÄÔËÓÃÊÇʮֹaºµÄ¡£±ÈÈ磬ÔÚ²»Í¬½ø³Ì¼a±£´aeÒ»¸o½aÊ͹ýµÄ¸´ÔÓµÄÅaÖÃÎļþ¡¢»o¾ßÌaÉeÖõÄÓû§µÈ£¬ÒÔ±ÜÃaÖظ´´¦Ài¡£ÎÒÒ²Ôø¾­Óù²ÏiÄÚ´aeµÄ¼¼Êo°ÑÒ»´oÅuPHP½Å±¾±ØÐeÒýÓõÄÒ»¸oºÜ´oµÄÎļþÅÈe¹²ÏiÄÚ´ae£¬²¢ÓÉ´ËÏÔÖøÌaÉýÁËWebþÎñµÄËٶȡ¢Ïu³ýÁ˲¿ÖÆ¿¾±¡£¹ØÓÚËuµÄʹÓû¹ÓÐÁÄÌiÊÒ£¬¶a¹a²¥µÈµÈ¡£IPCµÄÍþÁ¦È¡¾oÓÚÄaµÄÏeÏoÁ¦µÄ´oС¡£Èç¹u±¾ÎĶÔÄaÓÐÒ»µaµaÆo*¢£¬ÄÇÎÒ²»Ê¤ÈÙÐÒ¡£Ô¸ÒaºÜÄaÌÖÂÛÕaÁiÈËÈeÃԵĵçÄÔ¼¼Êo¡£Email: qwyaxm@163.net

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例