ホームページ  >  記事  >  バックエンド開発  >  PHP はメッセージ キューを介して C (または他の言語) と通信します。完全な code_PHP チュートリアル

PHP はメッセージ キューを介して C (または他の言語) と通信します。完全な code_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:06:37935ブラウズ

/*
 * クラスメッセージ
 * php と php の間の通信に使用します;
 ※作成日時:2012/10/31 12:08
 * 著者: leixun(lein_urg@163.com)
 *バージョン1 - 2012/10/31 14:01
 */
クラスメッセージ{
    プライベート $id; 
    プライベート $msg_id; 
    プライベート $_serialize = true; 
   /**
     * @param $_id ID
    */
    パブリック関数 msg($_id, $_serialize = true){
        if(!function_exists('msg_get_queue'))
        {
            die('msg キュー関数がインストールされていません。 --enable-sysvmsg
' で PHP を再構成してください。 
        }
        $this->id = $_id; 
        $this->msg_id = msg_get_queue ( $_id ); 
        $this->_serialize = $_serialize; 
        if ($this->msg_id === false) {
            die(basename(__FILE__).'->'.__LINE__.': メッセージ キューを作成できません'); 
        }
    }
    /**
     * @data 送信するデータ
     * @type メッセージタイプ
    */
    パブリック関数 send( $data, $type = 1, $blocking = false )
    {
        if (!msg_send ($this->msg_id, $type, $data, $this->_serialize, $blocking, $msg_err))
        {
            return "$msg_errn のためメッセージは送信されませんでした"; 
        }
        true を返します。 
    }
 
    /**
     * @param $type メッセージタイプ
     * @param $maxsize 受け入れられるメッセージの最大サイズ
    */
    パブリック関数受信($no_wait = true, $type = 1 , $maxsize = 1024 )
    {
        $rs = msg_receive ( $this->msg_id , $type , $type , $maxsize , $message , $this->_serialize, $no_wait?MSG_IPC_NOWAIT:NULL , $errorcode); 
        if($rs)
            $message を返します。 
        その他
            false を返します。 
    }
 
    パブリック関数 Remove()
    {
        msg_remove_queue($this->msg_id); 
    }
}
[php] plaincopy を表示
define('base_path' , dirname(__FILE__));//msg_write.php
include(base_path.'/msg.php'); 
$msg = 新しいメッセージ(1, false); 
$msg1 = 新しいメッセージ(2, false); 
if($argv[1]=='del') $msg->remove(); 
  
  
$str = 'このページにはユーザーが投稿したメモはありません。'; 
その間(1){
        $data = substr($str,0,rand(18,25)); 
        $msg->send(rand().$data, rand(1,10)); 
        echo $data." -> 送信されました"; 
        echo 'Get:'.$msg1->receive(false, 0).chr(10); 
        スリープ(3); 
      //usleep(10000); 
}
「完了」をエコーし​​ます。 
C、gcc -g -o m msg.c -lpthread;
[cpp] プレーンコピーを表示します
#include  
#include  
 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#define MAX_MSG_LEN 512
静的 int php_msg = -1; 
静的 int php_msg1 = -1; 
静的 int 実行中 = 1; 
static void *php_msg_handler_thread(void *arg); 
static int msg_send(int msg_id, int fd, char *data);  
struct msg_st {
    長い mtype; 
    char mtext[MAX_MSG_LEN]; 
};   
void logst(struct msg_st some_data); 
int main(int argc,char **argv)
{
    printf("go 1 n"); 
    if((php_msg= msgget((key_t)1,0666|IPC_CREAT)) == -1)
    {
        perror("php_msg create"); 
        0を返します。 
    }
    if((php_msg1= msgget((key_t)2,0666|IPC_CREAT)) == -1)
    {
        perror("php_msg create"); 
        0を返します。 
    }
    //////////////////////////////////////////////// //////////////////////////////
    pthread_t php_msg_pthread; 
    int rs = pthread_create(&php_msg_pthread, NULL, (void*(*)(void*))php_msg_handler_thread, (void *)NULL); 
   if(rs!=0)
    {
        perror("php_msg_pthread create"); 
        0を返します。 
    }
    pthread_join(php_msg_pthread, NULL); 
    0を返します。 
}
static void *php_msg_handler_thread(void *arg)
{
    struct msg_st php_data;      
    printf("sizeof(struct msg_st)=%dn",sizeof(struct msg_st)); 
    int msg_to_recevie = 0; 
    char* データ。 
    データ = malloc(MAX_MSG_LEN); 
    char *pre = "あなたは私にこう言いました:";  
    (実行中){
        if(msgrcv(php_msg,(void *) &php_data, MAX_MSG_LEN, msg_to_recevie , 0) == -1)
        {
            perror("msgrcv"); 
            if(errno==E2BIG)
            {
                if(msgctl(php_msg,IPC_RMID,0) == -1)
                {
                    fprintf(stderr,"msgctl(IPC_RMID) が失敗しました n");   
                }
            }
            else if(errno == EINVAL)
            {
                スリープ(1); 
            }
        }その他{
            printf("受信者メッセージ : %s 、タイプ = %d、msg_to_recevie= %d;n"、php_data.mtext、php_data.mtype、msg_to_recevie); 
            memset(データ, ' ', MAX_MSG_LEN); 
            memcpy(データ、プレ、strlen(プレ)); 
            memcpy(data+strlen(pre), php_data.mtext, strlen(php_data.mtext)); 
            msg_send(php_msg1, 2, データ);     
            bzero(php_data.mtext, strlen(php_data.mtext)); 
        }
        //壊す; 
    }
    無料(データ); 
}
static int msg_send(int msg_id, int fd, char *data)
{
    struct msg_st* some_data; 
    some_data = malloc( sizeof(struct msg_st) ); 
    memcpy(some_data->mtext, data, strlen(data) + 1); 
    some_data->mtext[strlen(data)] = ' '; 
    some_data->mtype= fd; 
    printf("%s n を送信します", &some_data->mtext); 
    if((msgsnd(msg_id,(void *) some_data, MAX_MSG_LEN,0)) == -1)
    {
        pererror("msgsnd"); 
        0を返します。 
    }
    1を返します。 
}
void logst(struct msg_st some_data)
{
    ファイル*fp; 
    fp = fopen("file.dat", "w+");    
    もし (!fp)
   {
       printf("ファイルオープンエラー!");   
        戻る; 
    }
    fwrite(&some_data, sizeof(struct msg_st), 1, fp);   
    fclose(fp);  
}
运行:./m
再运行:php msg_write.php

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/477913.html技術記事 ?php /* * class msg * php と php 間の通信に使用します。 * 作成日時: 2012/10/31 12:08 * 作成者: leixun(lein_urg@163.com) * バージョン 1 - 2012/10/31 14:01 */ class msg{ privat...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。