`
hongtoushizi
  • 浏览: 370562 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

PHP与C(或其它语言)通过消息队列进行通讯,完整代码

    博客分类:
  • php
php 
阅读更多

转载自: PHP与C(或其它语言)通过消息队列进行通讯,完整代码

 

<?php
/*
 * class msg
 * Use for communication between php and php;
 * Create at: 12:08 2012/10/31
 * Author: leixun(lein_urg@163.com)
 * version 1 - 14:01 2012/10/31
 */

class msg{
	private $id;
	private $msg_id;
	private $_serialize = true;

	/**
	 * @param $_id ID
	 */
	public function msg($_id, $_serialize = true){
		if(!function_exists('msg_get_queue'))
		{
			die('msg queue function not installed, Reconfigure PHP with --enable-sysvmsg <br/>');
		}
		$this->id = $_id;
		$this->msg_id = msg_get_queue ( $_id );
		$this->_serialize = $_serialize;
		if ($this->msg_id === false) {
			die(basename(__FILE__).'->'.__LINE__.': Unable to create message quee');
		}
	}

	/**
	 * @data data to send
	 * @type message type
	 */
	public function send( $data, $type = 1, $blocking = false )
	{
		if (!msg_send ($this->msg_id, $type, $data, $this->_serialize, $blocking, $msg_err))
		{
			return "Msg not sent because $msg_err\n";
		}
		return true;
	}

	/**
	 * @param $type message type
	 * @param $maxsize The maximum size of message to be accepted,
	 */
	public function receive($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)
			return $message;
		else
			return false;
	}

	public function remove()
	{
		msg_remove_queue($this->msg_id);
	}	
}

 

<?php
define('base_path' , dirname(__FILE__));//msg_write.php
include(base_path.'/msg.php');
$msg = new msg(1, false);
$msg1 = new msg(2, false);
if($argv[1]=='del') $msg->remove();
 
 
$str = 'There are no user contributed notes for this page.';
while(1){
        $data = substr($str,0,rand(18,25));
        $msg->send(rand().$data, rand(1,10));
        echo $data." -> sent\n";
        echo 'Get:'.$msg1->receive(false, 0).chr(10);
        sleep(3);
        //usleep(10000);
}
echo 'Done';


 

C, gcc -g -o m msg.c -lpthread;

#include <stdio.h>
#include <errno.h>

#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#define MAX_MSG_LEN 512
static int php_msg = -1;
static int php_msg1 = -1;

static int running = 1;

static void *php_msg_handler_thread(void *arg);
static int msg_send(int msg_id, int fd, char *data);

struct msg_st {
	long mtype;
	char mtext[MAX_MSG_LEN];
};

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");
		return 0;
	}
	
	if((php_msg1= msgget((key_t)2,0666|IPC_CREAT)) == -1)
	{
		perror("php_msg create");
		return 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");
		return 0;
	}

	pthread_join(php_msg_pthread, NULL);
	return 0;

}

static void *php_msg_handler_thread(void *arg)
{
	struct msg_st php_data;		
	printf("sizeof(struct msg_st)=%d\n",sizeof(struct msg_st));

	char* data;
	data = malloc(MAX_MSG_LEN);
	char *pre = "You told me:";	
	while(running){
		//ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); 
		if(msgrcv(php_msg,(void *) &php_data, MAX_MSG_LEN, 0 , 0) == -1)
		{
			perror("msgrcv");
			if(errno==E2BIG)
			{				
				if(msgctl(php_msg,IPC_RMID,0) == -1)  
				{  
					fprintf(stderr,"msgctl(IPC_RMID) failed \n");  
				}   
			}
			else if(errno == EINVAL)
			{
				sleep(1);
			}
		}else{		
			printf("recevier mssage : %s , type= %d\n", php_data.mtext, php_data.mtype);
			memset(data, '\0', MAX_MSG_LEN);
			memcpy(data, pre, strlen(pre));

			memcpy(data+strlen(pre), php_data.mtext, strlen(php_data.mtext));
			msg_send(php_msg1, 2, data);
			
			bzero(php_data.mtext, strlen(php_data.mtext));
		}
		//break;
	}
	free(data);
}


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)] = '\0';
	some_data.mtype= fd;

	printf("will send %s \n", &some_data.mtext);
	//int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 
	if((msgsnd(msg_id,(void *) & some_data, strlen(data), 0)) == -1)			
	{
		perror("msgsnd");
		return 0;
	}

	return 1;
}



 

运行:./m

再运行:php msg_write.php

 

 

 

分享到:
评论

相关推荐

    最新PHP脉聊交友网站搭建,可通过功能+广告变现,社交在线聊天交友即时通讯【APP源码+视频教程】

    可以通过API接口与第三方社交平台对接,允许用户一键分享内容到其他社交网络。 #### 2.2 广告变现策略 - **广告位设置**:在不影响用户体验的前提下,合理规划广告展示位置。比如首页顶部、底部,个人主页侧边栏等...

    JAVA上百实例源码以及开源项目源代码

    Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...

    ActiveMQ教程

    其核心概念是允许独立的应用程序在不同的系统中通过消息队列进行通信。 ### ActiveMQ核心功能和特点 - **遵循JMS和J2EE规范**:ActiveMQ提供JMS规范的完整实现,支持JMS 1.1中的所有功能,包括持久化、事务(XA消息...

    花椒直播基于golang的中台技术实践19.9 .pdf

    4. NSQ或Kafka消息队列:Golang与这些消息中间件的集成,实现了异步处理和任务调度,增强了系统的伸缩性和可靠性。 5. Push服务:Golang与其他语言(如Java、PHP)协作,用于实时推送通知,确保用户及时接收直播更新...

    chatroom.rar

    蓝雨聊天室源码是一种用于构建实时在线聊天应用的软件代码,通常由一系列编程语言(如JavaScript、PHP、Python等)编写而成,结合前端和后端技术实现用户间的即时通讯功能。在这个名为"chatroom.rar"的压缩包文件中...

    java开源包8

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包10

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    hipchat-clone:一个简单的聊天应用程序,当 Hipchat 不可用时

    7. **实时消息队列**:为了处理高并发和消息顺序,项目可能使用了消息队列如 RabbitMQ 或 Redis。 8. **版本控制**:项目名为 "hipchat-clone-master",暗示可能使用 Git 进行版本控制,理解 Git 命令和协作流程是...

    java开源包1

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包11

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包2

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包3

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包6

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包5

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包4

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包7

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包9

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    java开源包101

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    Java资源包01

    JOpenID是一个轻量级的OpenID 2.0 Java客户端,仅50KB+(含源代码),允许任何Web网站通过OpenID支持用户直接登录而无需注册,例如Google Account或Yahoo Account。 JActor的文件持久化组件 JFile JFile 是 JActor ...

    Email-Q

    通过使用邮件队列,Email-Q允许开发者将邮件存储在数据库或文件系统中,然后按照设定的策略和时间间隔逐一发送,从而实现更稳定、更可控的邮件发送服务。 首先,让我们深入了解一下PHP。PHP(Hypertext ...

Global site tag (gtag.js) - Google Analytics