cURL百科
cURL是一个开源项目,主要的产品是curl(命令行工具)和libcurl(C语言的API库),两者功能均是:基于网络协议,对指定URL进行网络传输。

cURL涉及是任何网络协议传输,不涉及对具体数据的具体处理。curl支持的通信协议有DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SBMS, SMTP, SMTPS, TELNET 和TFTP。

cURL 官方网站

https://curl.se/

cURL 例子
cURL 简单模式:

$ curl http://example.com

cURL 详细(verbose)模式:

$ curl --verbose http://example.com
$ curl -v http://example.com

cURL 下载(output):

$ curl --output output.html http://example.com/
$ curl -o output.html http://example.com/

cURL 重定向:(curl默认不会重定向)

$ curl --location output.html http://example.com/
$ curl -L output.html http://example.com/

使用 curl 在命令行获取网站的响应时间

curl -L -w "time_namelookup: %{time_namelookup}\ntime_connect: %{time_connect}\ntime_appconnect: %{time_appconnect}\ntime_pretransfer: %{time_pretransfer}\ntime_redirect: %{time_redirect}\ntime_starttransfer: %{time_starttransfer}\ntime_total: %{time_total}\n" https://example.com/

结果:

<!doctype html>
<html>
...
</html>
time_namelookup: 0.020519
time_connect: 0.187338
time_appconnect: 0.546461
time_pretransfer: 0.546661
time_redirect: 0.000000
time_starttransfer: 0.710620
time_total: 0.710879

time_appconnect and time_connect time tells us how much time is spent in SSL/TLS handshake. For a cleartext connection without SSL/TLS, this number is reported as zero.
Also note that time_redirect is zero in both outputs above. That is because no redirection occurs while visiting example.com.

curl post file as body
curl POST 二进制文件
strip new lines

curl --data "@/path/to/filename" http://...

keep new lines

curl --data-binary "@/path/to/filename" http://...

第34届中国电影金鸡奖提名名单公布 update:2021-11-30
11月29日,第34届中国电影金鸡奖公布提名名单及金鸡奖主视觉海报。主视觉海报源自海报设计大赛获奖作品,海报中的雄鸡形象呈现五彩变化。其中,中国红昭示建党百年的坚定和炽烈,生态绿映衬和谐发展的生机和希望,海天蓝饱含海天一色的清朗和大气,荣耀金彰显电影强国的梦想和使命,古典则墨散发传统文化的气质和魅力。

再见吧,少年 magnet
影片根据真人真事改编,讲述了少年王新阳的生活因突患白血病而彻底改变,面对未知的明天,新阳依然乐观坚强,努力实现青春梦想的故事。

ed2k://|file|%E5%86%8D%E8%A7%81%E5%90%A7%EF%BC%81%E5%B0%91%E5%B9%B4.1080p.HD%E5%9B%BD%E8%AF%AD%E4%B8%AD%E8%8B%B1%E5%8F%8C%E5%AD%97[66%E5%BD%B1%E8%A7%86www.66Ys.Co].mkv|2620292594|F6E5FF694B49316BE33C15376F54D6C2|/
magnet:?xt=urn:btih:db3b32f7d4ae6a53c2dfef1ba0c4f07f9a6eee71

第三十四届中国电影金鸡奖提名名单

提名名单方面,《中国医生》《守岛人》《我和我的家乡》《我的姐姐》《革命者》《悬崖之上》入围最佳故事片,尹力(《没有过不去的年》)、张艺谋(《悬崖之上》)、黄建新和郑大圣(《1921》)、韩延(《送你一朵小红花》)、路阳(《刺杀小说家》)入围最佳导演,于和伟(《悬崖之上》)、刘烨(《守岛人》)、张译(《悬崖之上》)、易烊千玺(《送你一朵小红花》)、郭晓冬(《我的父亲焦裕禄》)入围最佳男主角,刘浩存(《送你一朵小红花》)、刘敏涛(《再见吧!少年》)、张小斐(《你好,李焕英》)、张子枫(《我的姐姐》)入围最佳女主角。在今年新增设的最佳外语片奖项中,总共有《匹诺曹》《困在时间里的父亲》《波斯语课》《狼行者》《就爱断舍离》5部影片入围。

今年12月28日至30日期间,2021年中国金鸡百花电影节将于福建省厦门市举办,第34届中国电影金鸡奖将在闭幕式上揭晓。

Referenced from:http://www.tjbh.com/c/2021-11-29/968945.shtml
第三十四届中国电影金鸡奖提名名单

第34届金鸡奖提名名单公布 《悬崖之上》《我和我的家乡》等 6部电影争夺最佳影片_中国经济网 update:2021-11-30
影片《悬崖之上》收获了包括最佳故事片奖在内的七个提名,领跑影片提名榜。

  除《悬崖之上》外,获得最佳故事片奖提名的还有《中国医生》《守岛人》《我和我的家乡》《我的姐姐》《革命者》。张艺谋也凭借《悬崖之上》,与《没有过不去的年》的导演尹力、《1921》的导演黄建新和郑大圣、《送你一朵小红花》的导演韩延、《刺杀小说家》的导演路阳共同提名最佳导演奖。

  此外,于和伟和张译凭借《悬崖之上》共同提名最佳男主角奖,并将和刘烨、易烊千玺、郭晓东竞争该奖项。刘浩存、刘敏涛、张小斐、张子枫提名最佳女主角奖。获最佳男配角奖提名的是朱亚文、刘培清、肖央、范伟、谢霆锋,最佳女配角奖的提名则包括丁柳元、朱媛媛、刘佳、周也、索朗旺姆。

  贾玲导演的《你好,李焕英》在今年春节档创造票房奇迹,也与于飞的《皮皮鲁与鲁西西之罐头小人》、旦真旺甲的《随风飘散》、宝音格西格的《哈日夫》一起,提名最佳导演处女作奖。近年来,国产纪录片佳作频出,《一起走过》《九零后》《大学》《光语者》《棒!少年》提名最佳纪录/科教片奖。

  值得一提的是,今年的金鸡奖新增设最佳外语片奖项,《匹诺曹》《困在时间里的父亲》《波斯语课》《狼行者》《就爱断舍离》五部影片获得提名。

  中国电影金鸡奖创建于1981年,自2005年起每两年评选一次,2020年起恢复为一年一评。据悉,2021年中国金鸡百花电影节将于12月28日至30日在福建厦门举办,届时也将举行第34届中国电影金鸡奖颁奖典礼等活动。

Referenced from:http://m.ce.cn/lv/gd/202111/30/t20211130_37125878.shtml

完整版名单如下:

  • 最佳故事片:《守岛人》
  • 最佳导演:张艺谋《悬崖之上》
  • 最佳编剧:余曦、黄欣、赵宁宇《1921》(原创)
  • 最佳男主角:张译(《悬崖之上》饰张宪臣)
  • 最佳女主角: 张小斐(《你好,李焕英》饰李焕英)
  • 最佳男配角:范伟(《一秒钟》饰范电影)
  • 最佳女配角:朱媛媛(《我的姐姐》饰姑妈(安蓉蓉))
  • 最佳导演处女作:旦真旺甲《随风飘散》
  • 最佳中小成本故事片:《冰下的鱼》
  • 最佳纪录/科教片:《九零后》
  • 最佳美术片:《白蛇2:青蛇劫起》
  • 最佳儿童片:《再见吧!少年》
  • 最佳戏曲片:《南越宫词》
  • 最佳外语片:《困在时间里的父亲》
  • 最佳摄影:赵小丁《悬崖之上》
  • 最佳音乐:陈光荣、陈永健《中国医生》
  • 最佳美术:霍廷霄《革命者》
  • 最佳剪辑:钟炜钊《拆弹专家2》
  • 最佳录音:陶经《一秒钟》
  • 评委会特别奖:《我和我的家乡》

我国将继续坚持房子是用来住的、不是用来炒的定位,因城施策、分类指导,着力稳地价、稳房价、稳预期,落实房地产市场长效机制,顺应居民高品质住房需求,更好解决居民住房问题。

当前,我国房地产市场出现降温态势,土地市场观望情绪也较浓厚。个别房地产企业遇到经营困难,出现资金链紧张等情况。国家统计局数据显示,房地产开发投资增速收窄;商品房销售面积和销售额有所下降;土地市场成交量下降;70个大中城市中,新房以及二手房价格环比下降的城市持续增多。

一年多来,有关部门实施重点房地产企业资金监测和融资管理的“三线四档”规则以及银行业金融机构房地产贷款集中管理制度,这些金融调控措施对市场产生较大作用,房企降杠杆、降负债的成效显现。

尽管当前市场遇冷,但应该看到,我国房地产市场风险总体可控,房地产市场健康发展的整体态势不会改变。近期我国房地产市场及相关金融市场的波动,是市场主体在个别企业违约事件出现之后的应激反应。在金融管理部门的预期引导下,金融机构和金融市场风险偏好过度收缩的行为正在矫正,融资行为和金融市场价格正逐步恢复正常。房地产领域合理的资金需求能够得到满足。银保监会的数据显示,10月末,银行业金融机构房地产贷款同比增长8.2%,整体保持稳定。个人住房贷款中90%以上用于支持首套房,投向住房租赁市场的贷款同比增长61.5%。

房地产行业降杠杆、降负债的过程中,可能出现短期阵痛。对于企业而言,降负债、降杠杆有利于改变过去盲目扩张行为,有助于挤出金融泡沫,为未来稳健发展打下基础,对着眼长远发展的企业有利。因此,避免高杠杆、高负债不仅是房企当前的重要任务,还应该长期坚持,不能因为短期环境变化,又重回盲目扩张的老路。

房地产金融政策对于房地产市场的影响较为显著,从近期主管部门的表态看,我国房地产市场的金融政策仍将以稳为主。央行表示,要维护房地产市场平稳健康发展。此外,要坚持稳健的货币政策,做好跨周期设计,统筹考虑今明两年政策衔接,更好支持消费投资恢复,抑制价格过快上涨,促进经济社会高质量发展。银保监会强调,要稳地价、稳房价、稳预期,遏制房地产金融化泡沫化倾向,健全房地产调控长效机制,促进房地产业稳定健康发展。

可以预计,房企靠高杠杆、高负债实现高利润的阶段恐将不再。与其不断猜测政策什么时候出,会怎么出,不如潜心研究客户需求,打造优质产品,提升精细服务。正如一位知名房企负责人所说,“围绕城市同步发展,围绕客户同步发展,我们仍有巨大机会”。管理红利时代已经到来,房企需要不断提升管理、运营、服务能力。紧跟国家未来发展规划,房企完全能在城市更新、老旧小区改造、住房租赁、物业管理、社区养老等方面赢得更多发展。

促进住房消费健康发展将成为“十四五”时期的一项重要任务。合理、健康的居住需求和消费可以得到满足,住房供应体系也将更加完善。比如,在人口净流入的大城市重点发展保障性租赁住房,以缓解新市民、青年人的住房困难,解决大城市住房突出问题。同时,住房供应要与人口数量紧密挂钩,人口集中的地方应扩大住房供给,人口流出的地方则应适当减少供给。

展望未来,我国将继续坚持房子是用来住的、不是用来炒的定位,因城施策、分类指导,着力稳地价、稳房价、稳预期,落实房地产市场长效机制,顺应居民高品质住房需求,更好解决居民住房问题,促进房地产行业平稳健康发展和良性循环。

Referenced from:http://paper.ce.cn/jjrb/html/2021-12/01/content_454336.htm
经济日报:房地产市场健康发展态势不会改变

中国官媒:房地产市场风险总体可控 健康发展的整体态势不会改变 | Reuters update:2021-12-1 路透上海12月1日 -
中国官媒--经济日报周三发表评论文章称,尽管当前市场遇冷,但中国房地产市场风险总体可控,健康发展的整体态势不会改变。金融机构和金融市场风险偏好过度收缩的行为正在矫正,融资行为和金融市场价格正逐步恢复正常。房地产领域合理的资金需求能够得到满足。

文章表示,近期中国房地产市场及相关金融市场的波动,是市场主体在个别企业违约事件出现之后的应激反应。

文章指出,除房地产市场出现降温外,土地市场观望情绪也较浓厚。从近期主管部门的表态看,房地产市场的金融政策仍将以稳为主。不过可以预计,房企靠高杠杆、高负债实现高利润的阶段恐将不再。

中国1-10月全国房地产开发投资同比增长7.2%,增速低于1-9月的8.8%,续创年内最低水平,两年平均增长6.8%;1-10月商品房销售面积同比增长7.3%,商品房销售额增长11.8%,两年平均分别增长3.6%和8.8%。1-9月则同比分别增长11.3%和16.6%。

中国央行罕见单独发布的10月个人房贷环比多增逾1,000亿元人民币,新华社等官媒随后报导称,11月上旬各家银行的房地产贷款投放力度进一步加大11月下旬。随后有消息称,部分银行收到监管通知放松房地产开发贷投放,满足开发商合理需求。

Referenced from:https://cn.reuters.com/article/china-state-media-property-comments-1201-idCNKBS2IG2PD?il=0

zmq介绍
ØMQ (也拼写作ZeroMQ,0MQ或ZMQ)是一个为可伸缩的分布式或并发应用程序设计的高性能异步消息库。它提供一个消息队列, 但是与面向消息的中间件不同,ZeroMQ的运行不需要专门的消息代理(message broker)。该库设计成常见的套接字风格的API。

ZeroMQ是由iMatix公司和大量贡献者组成的社群共同开发的。 ZMQ 是一个简单好用的传输层,像框架一样的一个socket library,他使得Socket编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核。

libzmq 下载地址

https://github.com/zeromq/libzmq/archive/refs/tags/v4.3.4.tar.gz

zmq github地址

https://github.com/zeromq/libzmq/

cppzmq github地址

https://github.com/zeromq/cppzmq

cppzmq 下载地址

https://github.com/zeromq/cppzmq/archive/refs/tags/v4.8.1.tar.gz

cppzmq 介绍

cppzmq is a C++ binding for libzmq. It has the following design goals:

cppzmq maps the libzmq C API to C++ concepts. In particular:
it is type-safe (the libzmq C API exposes various class-like concepts as void*)
it provides exception-based error handling (the libzmq C API provides errno-based error handling)
it provides RAII-style classes that automate resource management (the libzmq C API requires the user to take care to free resources explicitly)
cppzmq is a light-weight, header-only binding. You only need to include the header file zmq.hpp (and maybe zmq_addon.hpp) to use it.
zmq.hpp is meant to contain direct mappings of the abstractions provided by the libzmq C API, while zmq_addon.hpp provides additional higher-level abstractions.

ubuntu 下编译 libzmq

wget https://github.com/zeromq/libzmq/archive/refs/tags/v4.3.4.tar.gz
tar xvf v4.3.4.tar.gz
cd libzmq-4.3.4/
./autogen.sh
mkdir build && cd build
cmake ..
make

cmake的时候提示没有libsodium,安装就好。

sudo apt install libsodium-dev

指定安装路径

cmake -DCMAKE_INSTALL_PREFIX=$(pwd)/../../install.x64 ..

make install 即可。

ubuntu 下编译cppzmq

wget https://github.com/zeromq/cppzmq/archive/refs/tags/v4.8.1.tar.gz
tar xvf v4.8.1.tar.gz
cd cppzmq-4.8.1/
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=$(pwd)/../../install.x64 ..
make install

Zmq通信场景

  • 线程之间(inproc)
  • 进程之间(ipc)
  • 机器之间(tcp)

Zmq通信模式

  • 请求-回复(Request-reply)。分为ZMQ_REQ、ZMQ_REP、ZMQ_DEALER、ZMQ_ROUTER
    REQ-REP模式是阻塞式的,也就是说必须要client先发送一条消息给server,然后server才可以返回一个response给client。任何顺序上的错误都会导致报错。

a) 服务端和客户端无论谁先启动,效果是相同的,这点不同于Socket。

b) 在服务端收到信息以前,程序是阻塞的,会一直等待客户端连接上来。

c) 服务端收到信息以后,会send一个“World”给客户端。值得注意的是一定是client连接上来以后,send消息给Server,然后Server再rev然后响应client,这种一问一答式的。如果Server先send,client先rev是会报错的。

d) ZMQ通信通信单元是消息,他除了知道Bytes的大小,他并不关心的消息格式。因此,你可以使用任何你觉得好用的数据格式。Xml、Protocol Buffers、Thrift、json等等。

  • 发布-订阅(Publish-subscribe)。分为ZMQ_PUB、ZMQ_SUB
    发布者只是绑定了端口,并进行信息发布,其并不care是否有接收者,有哪些接收者。

要说明的两点就是:

  1. 服务器端一直不断的广播中,如果中途有 Subscriber 端退出,并不影响他继续的广播,当 Subscriber 再连接上来的时候,收到的就是后来发送的新的信息了。这对比较晚加入的,或者是中途离开的订阅者,必然会丢失掉一部分信息,这是这个模式的一个问题,所谓的 Slow joiner。

注意这个slow joiner问题,之后会为了解决这个问题而设计新的模式。

2.但是,如果 Publisher 中途离开,所有的 Subscriber 会 hold 住,等待 Publisher 再上线的时候,会继续接受信息。

  • 管道(Pipeline)。分为ZMQ_PUSH、ZMQ_PULL
    管道模式(Pipeline) 这样的场景,如果需要统计各个机器的日志,我们需要将统计任务分发到各个节点机器上,最后收集统计结果,做一个汇总。PipeLine 比较适合于这种场景。Pipeline的原理就是:有一个Publisher来发布任务,这些任务是可以平行执行的。有一批Worker用于接收任务,Worker处理完任务之后就将结果发送到Sink之中用于归总或进一步处理。

所以要明确的是Pipeline之中并不是服务器,客户端的关系了,而是有三种对象——Ventilator,Worker,Sink
task ventilator 使用的是bind SOCKET_PUSH,将任务分发到 Worker 节点上。而 Worker 节点上,使用 connect SOCKET_PULL 从上游接受任务,并使用connect SOCKET_PUSH 将结果汇集到bind Slink。

  • 对立对(Exclusive pair)。分为ZMQ_PAIR

libzmq 交叉编译

./configure --host=arm-linux-gnueabihf --without-libsodium --prefix=$(pwd)/../install.arm --disable-libbsd

zmq_proxy_steerable 说明

int zmq_proxy_steerable (const void *frontend, const void *backend, const void *capture, const void *control);

第四个参数“control”。如果控制socket不为NULL,这个代理支持后续的控制操作。如果这个socket接收到SUSPEND0消息,此代理将延迟它的活动。如果接到了RESUME0消息,它将继续工作。如果收到了TERMINATE0消息,它将平滑的(smoothly)结束。如果接到了STATISTICS0消息 代理将回复控制套接字,发送一个8帧的多部分消息,每个消息具有64位的无符号整数,其顺序如下:前端套接字接收的消息数===>前端套接字接收的字节数===>发送给前端套接字的消息数量===>前端套接字发送的字节数===>后端套接字接收的消息数===>后端套接字接收的字节数===>发送后端套接字的消息数===>发送后端套接字的字节数。
如果控制socket为NULL,此函数和zmq_proxy的工作方式一样。
当控制socket接收到TERMINATE时zmq_proxy_steerable()函数返回0,。否则,返回 -1,并且设置errno为ETERM。
创建一个共享的代理队列

//  Create frontend, backend and control sockets
void *frontend = zmq_socket (context, ZMQ_ROUTER);
assert (backend);
void *backend = zmq_socket (context, ZMQ_DEALER);
assert (frontend);
void *control = zmq_socket (context, ZMQ_SUB);
assert (control);
//  Bind sockets to TCP ports
assert (zmq_bind (frontend, "tcp://*:5555") == 0);
assert (zmq_bind (backend, "tcp://*:5556") == 0);
assert (zmq_connect (control, "tcp://*:5557") == 0);
// Subscribe to the control socket since we have chosen SUB here
assert (zmq_setsockopt (control, ZMQ_SUBSCRIBE, "", 0));
//  Start the queue proxy, which runs until ETERM or "TERMINATE" received on the control socket zmq_proxy (frontend, backend, NULL, control);

在另一个节点上创建一个控制器,进程或者其它

void *control = zmq_socket (context, ZMQ_PUB);
assert (control);
assert (zmq_bind (control, "tcp://*:5557") == 0);
// stop the proxy 
assert (zmq_send (control, "STOP", 5, 0) == 0);
// resume the proxy
assert (zmq_send (control, "RESUME", 7, 0) == 0);
// terminate the proxy
assert (zmq_send (control, "TERMINATE", 10, 0) == 0);

zmq router dealer 介绍

“请求-响应”代理使用ZMQ_ROUTER、ZMQ_DEALER
ZMQ_DEALER
ZMQ_DEALER类型的套接字是用于扩展“请求/应答”套接字的高级模式
发送消息时:当ZMQ_DEALER套接字由于已达到所有对等点的最高水位而进入静音状态时,或者如果根本没有任何对等点,则套接字上的任何zmq_send()操作都应阻塞,直到静音状态结束或至少一个对等方变得可以发送;消息不会被丢弃
接收消息时:发送的每条消息都是在所有连接的对等方之间进行轮询,并且收到的每条消息都是从所有连接的对等方进行公平排队的
将ZMQ_DEALER套接字连接到ZMQ_REP套接字时,发送的每个消息都必须包含一个空的消息部分,定界符以及一个或多个主体部分
REQ和ROUTER交流,DEALER与REP交流。

我们的代理必须是非阻塞的,可以使用zmq_poll()来轮询任何一个套接字上的活动,但我们不能使用REQ-REQ。幸运地是,有两个称为DEALER和ROUTER的套接字,它们能我们可以执行无阻塞的请求-响应

客户端的流程如下:将REQ套接字连接到代理的ROUTER节点上,向ROUTER节点发送“Hello”,接收到“World”的回复
服务端的流程如下:将REP套接字连接到代理的DEALER节点上
代理端的流程如下:
创建一个ROUTER套接字与客户端相连接,创建一个DEALER套接字与服务端相连接
ROUTER套接字从客户端接收请求数据,并把请求数据发送给服务端
DEALER套接字从服务端接收响应数据,并把响应数据发送给客户端
客户端的消息是有顺序到达客户端的,消息会自动进行排队

ZMQ_ROUTER 兼容的对等套接字 ZMQ_DEALER、ZMQ_REQ、ZMQ_ROUTER
ZMQ_DEALER 兼容的对等套接字 ZMQ_ROUTER、ZMQ_REP、ZMQ_DEALER

“请求-响应模型”支持的套接字类型有4种:
ZMQ_REP
ZMQ_REQ
ZMQ_DEALER
ZMQ_ROUTER

php zmq

安装 sudo apt install php-zm

php zmq 示例

<?php

/* Create new queue object */
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_PUB);
$queue->connect("tcp://127.0.0.1:5554");

while (1) {
  $queue->send("hello there!");
}

php zmq req示例

<?php

/* Create new queue object */
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ, "MySock1");

/* Connect to an endpoint */
$queue->connect("tcp://127.0.0.1:5555");

/* send and receive */
var_dump($queue->send("hello there, using socket 1")->recv());

?>

php zmq req 非阻塞示例

<?php

/* Create new queue object */
$queue = new ZMQSocket(new ZMQContext(), ZMQ::SOCKET_REQ, "MySock1");
$queue->connect("tcp://127.0.0.1:5555");

/* Assign socket 1 to the queue, send and receive */
$retries = 5;
$sending = true;
$sent    = false;

$queue->setSockOpt (ZMQ::SOCKOPT_LINGER, 1000);

echo "Trying to send message\n";
do {
    try {
        if ($sending) {
            if ($queue->send("This is a message", ZMQ::MODE_DONTWAIT) !== false) {
                echo "Message sent\n";
                $sent    = true;
                $sending = false;
            }
        }
    } catch (ZMQSocketException $e) {
        die(" - Error: " . $e->getMessage());
    }
    usleep (1000);
} while (1 && --$retries);

$retries = 2;
$receiving = true;
$received  = false;

echo "Trying to receive message\n";
do {
    try {
        if ($receiving) {
            $message = $queue->recv (ZMQ::MODE_DONTWAIT);
            
            if ($message) {
                echo "Received message: " . $message . "\n";
                $receiving = false;
                $received = true;
            }
        }
    } catch (ZMQSocketException $e) {
        die(" - Error: " . $e->getMessage());
    }
    sleep (1);
} while (1 && --$retries);

if (!$received) {
    echo "The receive timed out\n";
}

?>

更多php-zmq示例
https://github.com/zeromq/php-zmq/tree/master/examples

ZeroMQ设置超时等待

设置一下超时等待,避免阻塞。

使用方法:

int timeout = 1000;
zmq_setsockopt (requester, ZMQ_RCVTIMEO, &timeout, sizeof(timeout));
zmq_setsockopt (requester, ZMQ_SNDTIMEO, &timeout, sizeof(timeout));

php zmq pipe line 示例
https://www.cnblogs.com/jkko123/p/6294575.html
pipeline中,send.php通过把累加任务分发给50个worker节点计算,然后worker节点计算完成后,把结果发送给result.php进行统一的汇总。

sender:

$sed = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$sed->bind("tcp://127.0.0.1:8881");

worker:

$rev = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$rev->connect("tcp://127.0.0.1:8881"); 
$sed = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$sed->connect("tcp://127.0.0.1:8882");

result:

$rev = new ZMQSocket($context, ZMQ::SOCKET_PULL); 
$rev->bind("tcp://127.0.0.1:8882");

C/C++使用ZeroMQ的Router/Dealer模式搭建高性能后台服务框架
ROUTER/DEALER的优点
没错,就是简单使用ZeroMQ提供的ROUTER/DEALER组合模式,可以轻松搭建一个高性能异步的C/C++后台服务框架。ROUTER可 以高效的接收客户端的请求,而DEALER可以负载均衡的调度后端Worker工作。当客户端的请求特别多,后端Worker处理不过来,需要增加 Worker的时候,也非常简单,新加入的Worker直接Connect到DEALER即可。如此运维起来也非常高效,后端可以非常简单的横向扩展!值的一提的是,ROUTER又叫做XREP,DEALER又叫做XREQ。

Dealer将后端Worker的应答数据转发到Router。
然后由Router寻址将应答数据准确的传递给对应的client。
值得注意的是,Router对client的寻址方式,得看client的‘身份’。
临时身份的client,Router会为其生成一个uuid进行标识。
永久身份的client,Router直接使用该client的身份。
ZMQ_REP套接字,其实就是一个“应答”,即,把应答数据回复给ZMQ_REQ,他们是严格的一问一答的方式。不过组合上 ZMQ_ROUTER,ZMQ_DEALER模式后,后台Worker不再是服务的死穴,可以通过横向扩展多个Worker来提高处理ZMQ_REQ的能 力。

ZMQ_REQ是“问”的套接字,它需要“答”套接字(ZMQ_REP)。不过目前ZMQ_REP已经被 ROUTER/DEALER华丽的包装成高富帅了。ZMQ_REQ只能通过联系ROUTER,然后由这个ROUTER/DEALER组成的DEVICE帮 忙传递“爱意”到达ZMQ_REP了,然后再默默的期待ROUTER传递ZMQ_REQ的“答复”。

ZeroMQ的ROUTER/DEALER模式

1、客户端(ZMQ_REQ)发送请求到ROUTER后,ROUTER是会对客户端进行身份表示的,正式因为有这个身份标示,所以ROUTER才有能力正确的把应答数据准确的传递到来源的客户端。

现在可以回答一下上文的一个思考题了—-ROUTER传递的3帧数据到底是什么数据:

A、第一帧是ROUTER自己加上的消息,这个是ROUTER对ZMQ_REQ所做的一个身份标识。说到身份标识,这里就引入到两种套接字。

一种叫做临时套接字,另外一种叫做永久套接字,他们的区别仅仅是是否使用ZMQ_IDENTITY。

没使用的即默认为临时套接字,我的这个文章里面的例子就是一个临时套接字。对于临时套接字,ROUTER会为它生成一个唯一的UUID,所以可以看到第一帧的长度为5,正是这个UUID。

而使用如下方式设定的套接字,则称为永久套接字。如果这样设置,那第一帧收到的消息长度就是13,而ROUTER也会直接使用www.example.com这个身份来标识这个客户端。

zmq_setsockopt(req, ZMQ_IDENTITY, “www.example.com”, 13);

B、第二帧是一个空帧,这是由REQ加上去的。可以理解为一个分隔符,当ROUTER遇到这个空帧后,就知道下一帧就是真正的请求数据了,这在多种组合模型里面尤其有用。

C、第三帧显然就是真正的请求数据了。这里的例子比较简单,复杂的例子,客户端可能会通过ZMQ_SNDMORE来发送多帧数据。如果是这样,那ROUTER还会继续收到第四帧,第五帧。。。数据的。

2、REQ到达ROUTER,ROUTER会公平排队,并公平的将REQ发往后端。但当后端能力不足的时候,导致ROUTER派发太慢的时候,ROUTER进入高水位的时候,ROUTER会丢弃掉消息的。所以这个得注意监控后台服务的性能。

3、DEALER会负载均衡的将任务派发后连接到它的各个工作Worker。
https://hottaro.com/index.php?document_srl=256&mid=Framework

《隐秘而伟大》为一部韩国电影,根据获得韩国Contents Award文化体育观光部长官奖的同名网络漫画改编而成。该片导演为张哲秀,于2012年10月17日正式开拍,经过五个月的拍摄后,于2013年6月5日上映,其后自8月5日开始在韩国上映《隐秘而伟大》加长剪辑版。
中国大陆 隐秘而伟大(常用译名)
香港 3个特攻美少年
台湾 伟大的隐藏者
《隐秘而伟大》是根据2010年漫画家Hun的同名网络漫画改编而成,以潜伏在首尔贫民区的朝鲜精英部队间谍“人体兵器”元流焕(金秀贤饰)为主角,讲述了他在和善良热心的邻居们接触的过程中,逐渐对自己的信念产生质疑,并由此引发的一系列故事。
元流焕接受代号“赤壁花”的潜行任务,潜入京畿道富川市的月亮村(即城中村),在当地与村民们打成一片,并暗中收集韩国民众的政治军事倾向及理念,向朝鲜进行汇报。元流焕作为间谍活动的最大原因除了是对祖国的忠诚,也是为了守护身在祖国自己母亲的安全。因长时间的韩国生活及善良热心的邻居,让他逐渐对自己的信念产生质疑。

元流焕与化身为吉他手并成为偶像歌手培训生的黑龙组第三代组长李海浪(朴基雄饰)以及五星组第四代组长李海真(李玹雨饰)是影片中的三名花美男间谍,而他正是三人组中的领袖式人物。影片主要讲述以元流焕为首的南派间谍花美男三人组潜伏的经历,以及他们被祖国抛弃后所发生的一系列故事。
隐秘而伟大 韩国电影 ed2k
ed2k://|file|%E9%9A%90%E7%A7%98%E8%80%8C%E4%BC%9F%E5%A4%A7.Secretly.Greatly.2013.1080p.x265.10bit-GOD.mkv|2928609884|75817599F544957CC87B90866B0F9FC2|/

ed2k://|file|%E9%9A%90%E7%A7%98%E8%80%8C%E4%BC%9F%E5%A4%A7.Secretly.Greatly.2013.BluRay.720p.mkv|2726433932|8ADE3CE390A1149641EFB0EA7739EDA3|/

资源名称:
隐秘而伟大]BD-MKV/10.66G1080P.mkv
资源链接:

magnet:?xt=urn:btih:FF765F2D15065624F585B34FA5A89610F9FFBDC6
magnet:?xt=urn:btih:15260aebf075de5432ab0580cbfc4eebff824514

은밀하게 위대하게 magnet
Secretly.Greatly.2013.720p.BluRay.x264.DTS.3AUDiO-mTHD.mkv (4,469.0M)

 magnet:?xt=urn:btih:e643a974945b11e1efaa2057bb0223ac88a02d02

secretly greatly chs magnet
隐秘而伟大.Secretly.Greatly.2013.BD1080P.X264.DTS.Mandarin&Korean.CHS. ...

magnet:?xt=urn:btih:ff765f2d15065624f585b34fa5a89610f9ffbdc6
magnet:?xt=urn:btih:2ce47014e23fe4192739be9a1c7118678f278d21&dn=隐秘而伟大.Secretly.Greatly.2013.BD1080P.X264.DTS.Mandarin&Korean.CHS.Mp4Ba