/*
* クラスメッセージ
* 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