相关疑难解决方法(0)

如何在PHP客户端和C守护程序服务器之间进行IPC?

并感谢您看一下这个问题.

背景
我有几台机器在很短的时间内连续产生多个(最多300)PHP脚本控制台.这些脚本快速运行(不到一秒钟)然后退出.所有这些脚本都需要只读访问大型trie结构,每次运行脚本时加载到内存中都非常昂贵.服务器运行Linux.

我的解决方案
创建一个C守护进程,将trie结构保存在内存中并接收来自PHP客户端的请求.它将收到来自每个PHP客户端的请求,对内存结构执行查找并回答答案,从而避免PHP脚本执行该工作.请求和响应都是短字符串(不超过20个字符)

我的问题
我是C守护进程和进程间通信的新手.经过大量研究,我已将选择范围缩小到Message Queues和Unix域套接字.消息队列似乎已经足够了,因为我认为(我可能错了)他们排队了守护进程的所有请求以连续回答它们.但是,Unix域套接字似乎更容易使用.但是,我有各种各样的问题,我无法找到答案:

  1. PHP脚本如何发送和接收消息或使用UNIX套接字与守护进程通信?相反,C守护进程如何跟踪它必须向哪个PHP进程发送回复?
  2. 我见过的守护进程的大多数例子都使用了一个带有睡眠条件的无限while循环.我的守护进程需要为任何时候可能出现的许多连接提供服务,并且响应延迟至关重要.如果PHP脚本在睡眠时发送请求,守护程序将如何反应?我已经阅读过有关民意调查和epoll的内容,这是等待收到邮件的正确方法吗?
  3. 每个PHP进程总是发送一个请求,然后等待接收响应.我需要确保如果守护程序关闭/不可用,PHP进程将等待设置的最大时间响应,如果没有收到回答将继续,而不是挂起.可以这样做吗?

数据结构的实际查找非常快,我不需要任何复杂的多线程或类似解决方案,因为我认为以FIFO方式处理请求就足够了.我还需要保持简单的愚蠢,因为这是一项关键任务服务,而且我对这类程序还是比较陌生的.(我知道,但我真的无法解决这个问题,学习经验会很棒)

我真的很感激代码片段,它为我所具有的具体问题提供了一些亮点.指南和指针的链接也将受到欢迎,这些指南将进一步了解这个低级别IPC的阴暗世界.

谢谢你的帮助!


更新

现在比我在提出这个问题时所了解的要多得多,我只是想向任何感兴趣的人指出,Thrift框架和ZeroMQ在抽象硬件,套接字级编程方面做得非常出色.Thrift甚至可以免费为您提供服务器的脚手架!

事实上,不要去构建网络服务器的所有艰苦工作,而是考虑使用已经为您解决问题的良好异步服务器编写应用程序服务器代码.当然,使用异步IO的服务器非常适合不需要密集CPU处理的网络应用程序(或者事件循环块).

python的例子:Twisted,gevent.我更喜欢gevent,而且我不包括龙卷风,因为它专注于HTTP服务器端.

Ruby的例子:EventMachine

当然,Node.js基本上是当今异步服务器的默认选择.

如果您想深入了解,请阅读C10k问题Unix网络编程.

php c daemon ipc

23
推荐指数
1
解决办法
1万
查看次数

PHP:如何调用标准库函数

我从PHP开始动态网页.我有一些用ANSI C编写的库来获取/设置参数和其他专有的东西.我想知道,有没有一个简单的解决方案在PHP中使用包装器来调用这个函数?是否已存在类/库?在我自己做这个的最佳做法是什么?我不想调用外部应用程序并使用stdin/stdout!

有一个简单的例子吗?我现在不想深入了解Zend文档,我只需要感受复杂性.

php c function call

8
推荐指数
1
解决办法
6123
查看次数

从PHP调用C/C++库函数 - 如何将-std = c + 11发送到编译器

I'm建立一个C++扩展PHP,使用config.m4中的模板,从这篇文章这篇文章.

我需要在标准中使用C++ 11来编译我的类,所以我使用了EXTRA_FLAGS子句:

EXTRA_FLAGS="-std=c++11"
Run Code Online (Sandbox Code Playgroud)

在我的config.m4中.最终代码:

PHP_ARG_ENABLE(vehicles,
    [Whether to enable the "vehicles" extension],
    [  --enable-vehicles      Enable "vehicles" extension support])

if test $PHP_VEHICLES != "no"; then
    EXTRA_FLAGS="-std=c++11"
    PHP_REQUIRE_CXX()
    PHP_SUBST(VEHICLES_SHARED_LIBADD)
    PHP_ADD_LIBRARY(stdc++, 1, VEHICLES_SHARED_LIBADD)
    PHP_NEW_EXTENSION(vehicles, vehicles.cc car.cc, $ext_shared)
fi
Run Code Online (Sandbox Code Playgroud)

这根本不起作用(编译器没有收到额外的标志).然后我假设这个EXTRA_FLAGS参数根本不与编译器相关,而是与脚本....

如何向g ++编译器发送标志给他们使用C++ 11?

谢谢你的帮助.

php c++ c++11

5
推荐指数
1
解决办法
771
查看次数

提取内部EXE信息

视窗EXE文件具有一定的元数据一样CompanyNameFileVersionInternalNameProductNameOriginalFileNameProductVersion,等。

如何使用PHP提取此类元数据?

php exe

4
推荐指数
1
解决办法
356
查看次数

从php调用c

我想知道是否有办法从PHP调用现有的C代码?

php c

2
推荐指数
1
解决办法
5056
查看次数

标签 统计

php ×5

c ×3

c++ ×1

c++11 ×1

call ×1

daemon ×1

exe ×1

function ×1

ipc ×1