<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]CentOS的Gearman安装与使用无错版,包含PHP的gearmand扩展,包括安装Gearmand及其PHP扩展，及简单task/worker，相当不容易。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Thu, 18 Dec 2014 07:22:35 +0000</pubDate> 
<guid>http://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：用PHP做一些简单的上传是没有任何的问题，但是要做断点上传好像也是没有大问题，但要是并发的切片加断点上传可能就会有问题了哟。<br/>第一个问题是合并问题：如果一上传就合并，PHP老半天不返回是一个方面(是PHP超时还是Nginx超时？)，这样势必会造成客户端因没返回，没法再启动新的上传进程，如果用php的追加写文件内存太大还会退出的可能，用上gearmand后出现异步同时写，可能加快了传输效率的同时IO可能会比较密集（假如同一时间并发上传的人多的情况。）。<br/>第二个问题是先后问题：如果并发时出现了传一半时最后一片先上传上来了怎么办？如果直接追加进文件是会不按顺序出错的，如果放在那儿不管，那啥时候管，这也是一个问题。<br/>第三个问题是锁的问题：并发时如果同时两片到了，像PHP这种如何去结合锁的功能呢？据我所知有memcache的add函数是原子操作，可以利用，那就设计到锁多久，是不是又回到第一个问题，返回时间得浪费多长时间呢。<br/>基于上面三点，看来PHP做这活不是太靠谱，于是引出了gearman这个模型，相当于异步处理，再集合PHP的memcache锁（memcache放内存，可能得用ttserver才行，协议一样的。），PHP上传逻辑处理，Nginx上传插件，才有可能做一个较为靠谱且稳定的分片，断点加多进程（多线程）上传服务搭建。<br/><br/>一、从源码安装gearmand遇到的各种外部代码版本及yum版本太低的导致各种编译不过的问题，历程相当的麻烦，特别是boost和这个libevent默认的yum install非常低，都给编译了，把rpm所强制删除了，最后才成功，再就是g++编译版本，得export后才能编译，否则一堆问题，都在下面有描写。<br/>出现第一个问题及处理办法：<br/>libgearman-server/plugins/queue/sqlite/instance.cc: In member function &#039;bool gearmand::queue::Instance::_sqlite_prepare(const std::string&amp;, sqlite3_stmt**)&#039;:<br/>libgearman-server/plugins/queue/sqlite/instance.cc:125: error: &#039;sqlite3_prepare_v2&#039; was not declared in this scope<br/>libgearman-server/plugins/queue/sqlite/instance.cc: In member function &#039;gearmand_error_t gearmand::queue::Instance::init()&#039;:<br/>libgearman-server/plugins/queue/sqlite/instance.cc:224: error: &#039;SQLITE_OPEN_READWRITE&#039; was not declared in this scope<br/>libgearman-server/plugins/queue/sqlite/instance.cc:224: error: &#039;SQLITE_OPEN_CREATE&#039; was not declared in this scope<br/>libgearman-server/plugins/queue/sqlite/instance.cc:224: error: &#039;sqlite3_open_v2&#039; was not declared in this scope<br/>make[1]: *** [libgearman-server/plugins/queue/sqlite/libgearman_server_libgearman_server_la-instance.lo] Error 1<br/>将队列存放在sqlite3或postgresql。这货是用的sqlite存队列啊：<br/>yum search sqlite<br/>yum install sqlite.x86_64 sqlite-devel.x86_64<br/>还是不行，参考：<br/>安装：https://jackxiang.com/post/7709/ 后，<br/>最后在编译Gearman时带上 --with-sqlite3=/usr/local/sqlite3，告诉编译器应该使用这个新的sqlite即可。<br/><textarea name="code" class="php" rows="15" cols="100">[root@test gearmand-1.1.12]# ./configure --with-sqlite3=/usr/local/sqlite3</textarea><br/><br/>出现第二个问题及处理办法：<br/>./libgearman-1.0/gearman.h:53:23: error: cinttypes: No such file or directory<br/>命令:<br/>yum install gcc44 gcc44-c++ libstdc++44-devel -y<br/>然后在环境变量里加入:<br/>export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc<br/>export CXX=/usr/bin/g++44<br/>保存退出后执行:<br/>source /etc/profile<br/>删除gearmand-0.34文件夹重新进行编译.<br/>重新进行编译后执行make这步......<br/><br/>看来还得重新export一次新的编译器，因为昨天的关了终端，今天的又没了：<br/> export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc&nbsp;&nbsp;//这行有问题~<br/> export CXX=/usr/bin/g++44<br/> g++ -o testmemcached testmemcached.cpp -lmemcached<br/>为何还是不行？<br/> echo $CC<br/>/usr/bin/gcc&nbsp;&nbsp;//没变，这儿有问题，再重新设置一次，查到上面这个or有问题：export CC=/usr/bin/gcc44。<br/># echo $CXX<br/>/usr/bin/g++44 //变了<br/><br/>重新设置，好了：<br/>export CC=/usr/bin/gcc44<br/>/usr/bin/gcc44<br/><br/>在后面有详细的说明，可以不source直接设置环境变量，因为编译后也不一定要这个版本的gcc的。<br/><br/><textarea name="code" class="php" rows="15" cols="100">
export CC=/usr/bin/gcc44 
export CXX=/usr/bin/g++44
删除gearmand-0.34文件夹重新进行编译，重新解开包：tar -zxvf gearmand-1.1.12.tar.gz ，好像用那个make clean不行:
 ./configure --with-sqlite3=/usr/local/sqlite3
 make &amp;&amp; make install
</textarea><br/><br/>出现第三个问题的处理办法：<br/>ibgearman-server/plugins/queue/mysql/queue.cc:430: error: &#039;mysql_error&#039; was not declared in this scope<br/>libgearman-server/plugins/queue/mysql/queue.cc: In function &#039;gearmand_error_t _mysql_queue_replay(gearman_server_st*, void*, gearmand_error_t (*)(gearman_server_st*, void*, const char*, size_t, const char*, size_t, const void*, size_t, gearman_job_priority_t, int64_t), void*)&#039;:<br/>libgearman-server/plugins/queue/mysql/queue.cc:446: error: &#039;MYSQL_RES&#039; was not declared in this scope<br/>libgearman-server/plugins/queue/mysql/queue.cc:446: error: &#039;result&#039; was not declared in this scope<br/>libgearman-server/plugins/queue/mysql/queue.cc:447: error: &#039;MYSQL_ROW&#039; was not declared in this scope<br/><br/>[root@test gearmand-1.1.12]# ./configure --help&#124;grep mysql<br/>&nbsp;&nbsp;--with-mysql=[ARG]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use MySQL client library [default=yes], optionally<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;specify path to mysql_config<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Full path to mysql_config program<br/><br/>看样子是想用mysql做队列queue的：<br/><textarea name="code" class="php" rows="15" cols="100">
 ./configure --with-sqlite3=/usr/local/sqlite3 --with-mysql=/usr/local/mysql
</textarea><br/><br/>加上还是报错，去了得了，不用mysql做队列，有sqlite足够了，<br/>--without-mysql就好了，来自：<br/>https://bugs.launchpad.net/gearmand/+bug/1327038 说的：<br/><textarea name="code" class="php" rows="15" cols="100">
 ./configure --with-sqlite3=/usr/local/sqlite3 --without-mysql
</textarea><br/><br/>出现第四个问题的解决办法：<br/>/home/xiangdong/software/gearmand-1.1.12/bin/gearadmin.cc:129: undefined reference to `boost::program_options::options_description::m_default_line_length&#039;<br/>/home/xiangdong/software/gearmand-1.1.12/bin/gearadmin.cc:129: undefined reference to `boost::program_options::options_description::options_description(std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;, unsigned int, unsigned int)&#039;<br/>bin/gearadmin.o: In function `boost::program_options::basic_command_line_parser&lt;char&gt;::run()&#039;:<br/>/usr/local/include/boost/program_options/detail/parsers.hpp:107: undefined reference to `boost::program_options::detail::cmdline::get_canonical_option_prefix()&#039;<br/>bin/gearadmin.o: In function `boost::program_options::basic_command_line_parser&lt;char&gt;::extra_parser(boost::function1&lt;std::pair&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;&gt;)&#039;:<br/>/usr/local/include/boost/program_options/detail/parsers.hpp:77: undefined reference to `boost::program_options::detail::cmdline::set_additional_parser(boost::function1&lt;std::pair&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt;, std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; const&amp;&gt;)&#039;<br/>collect2: ld returned 1 exit status<br/>make[1]: *** [bin/gearadmin] Error 1<br/>make[1]: Leaving directory `/home/xiangdong/software/gearmand-1.1.12&#039;<br/><br/><br/>[root@test gearmand-1.1.12]# ./configure --help&#124;grep boost<br/>&nbsp;&nbsp;--with-boost[=ARG]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use Boost library from a standard location<br/>&nbsp;&nbsp;--with-boost-libdir=LIB_DIR<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Force given directory for boost libraries. Note that<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fails and you know exactly where your boost<br/>&nbsp;&nbsp;--with-boost-program-options[=special-lib]<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use the program options library from boost - it is<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--with-boost-program-options=boost_program_options-gcc-mt-1_33_1<br/><br/>指定boost的库：<br/>从这儿得知在这儿呢：&nbsp;&nbsp;http://jackxiang.com/post/7706/<br/>系统默认会将include拷贝到/usr/local/include/boost/中<br/>将lib拷贝到/usr/local/lib下<br/>yum install boost-devel&nbsp;&nbsp;[实践失败]<br/>回头了解下boost的结构，rpm包是啥样的，如下所示，版本号1.33，有可能是因为lddconfig里默认配置指向这个旧版本了，如下：<br/> vi /etc/ld.so.conf<br/><textarea name="code" class="php" rows="15" cols="100">
include ld.so.conf.d/*.conf
/lib
/lib64
/usr/lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
/usr/lib64
/usr/local/lib
/usr/local/lib
</textarea><br/><br/>[root@test ~]# rpm -ql boost-1.33.1-16.el5_9<br/>/usr/lib64/*.so.*&nbsp;&nbsp;//各种so文件<br/>/usr/lib/*.so.*&nbsp;&nbsp;&nbsp;&nbsp; //各种so文件<br/> rpm -ql boost-devel-1.33.1-16.el5_9<br/> /usr/include/boost&nbsp;&nbsp;里面是各种分类目录，里面是hpp头文件<br/>algorithm/<br/>archive/<br/>assign/<br/>bind/<br/>compatibility<br/>config/<br/>devel包里还有静态a文件及动态so文件：<br/>/usr/lib/libboost_test_exec_monitor.a<br/>/usr/lib/libboost_test_exec_monitor.so<br/><br/>如下实践试试：<br/>cd /home/xiangdong/software/boost_1_57_0<br/>./bootstrap.sh --prefix=/usr/local/boost-1.57<br/>vi tools/build/v2/user-config.jam<br/>文件尾部增加(没找到，直接./b2 ./b2 install 即可！)：<br/>using mpi&nbsp;&nbsp;<br/>./b2<br/>./b2 install<br/><br/><textarea name="code" class="php" rows="15" cols="100">
1）安装好boost并将gearmand指向它：
./b2 &amp;&amp; ./b2 install
ls /usr/local/boost-1.57/
include&nbsp;&nbsp;lib
2）安装gearman，重新删除掉原来的安装包并加上最新的gcc编译器版本：
rm -Rf gearmand-1.1.12
tar -zxvf gearmand-1.1.12.tar.gz 
export CC=/usr/bin/gcc44
export CXX=/usr/bin/g++44
cd gearmand-1.1.12
3）重新准备好后，开始编译，如下：
./configure --with-sqlite3=/usr/local/sqlite3 --without-mysql&nbsp;&nbsp; --with-boost=/usr/local/boost-1.57&nbsp;&nbsp; --with-boost-libdir=/usr/local/boost-1.57/lib
make &amp;&amp; make install
</textarea><br/>Boost headers version &gt;= 1.39.0<br/>[root@localdomain gearmand-1.1.12]# yum search boost<br/>[root@localdomain gearmand-1.1.12]# yum install boost.x86_64<br/>[root@localdomain gearmand-1.1.12]# yum install yum install boost-devel.x86_64<br/>旧的yum源，直接干死，用源码装个试试：<br/><textarea name="code" class="php" rows="15" cols="100">
[root@test ~]#&nbsp;&nbsp;rpm -qa&#124;grep boost
boost-1.33.1-16.el5_9
boost-1.33.1-16.el5_9
boost-devel-1.33.1-16.el5_9
boost-devel-1.33.1-16.el5_9
[root@test ~]# rpm -e boost-devel-1.33.1-16.el5_9
error: &quot;boost-devel-1.33.1-16.el5_9&quot; specifies multiple packages
[root@test ~]# rpm -e boost-1.33.1-16.el5_9
error: &quot;boost-1.33.1-16.el5_9&quot; specifies multiple packages
[root@test ~]# rpm –allmatches --nodeps -e boost-1.33.1-16.el5_9
error: package –allmatches is not installed
error: &quot;boost-1.33.1-16.el5_9&quot; specifies multiple packages
[root@test ~]# rpm -e --allmatches --nodeps&nbsp;&nbsp;boost-1.33.1-16.el5_9&nbsp;&nbsp;&nbsp;&nbsp;
[root@test ~]#&nbsp;&nbsp;rpm -e --allmatches --nodeps boost-devel-1.33.1-16.el5_9
</textarea><br/><br/><br/>出现第五个问题的解决办法：<br/>/home/xiangdong/software/gearmand-1.1.12/libgearman-server/gearmand_con.cc:677: undefined reference to `event_initialized&#039;<br/>collect2: ld returned 1 exit status<br/>libevent版本太老了，更新新的版本：<br/>安装最新版本的libevent,并执行以下操作:(备份老版本的/usr/lib64/libevent.so)<br/>ln -s /usr/lib64/libevent-2.0.so.5 /usr/lib64/libevent.so<br/>删除老旧的libevent的rpm包后，安装最新的方法实践如下：<br/>[root@test software]# cp&nbsp;&nbsp;/usr/lib64/libevent.so /usr/lib64/libevent.so.bak.old<br/>[root@test libevent-2.0.21-stable]# tar -zxvf libevent-2.0.21-stable.tar.gz <br/>[root@test libevent-2.0.21-stable]# cd libevent-2.0.21-stable<br/>[root@test libevent-2.0.21-stable]# ./configure --prefix=/usr/local/libevent-2.0.21-stable<br/><br/><br/>ls -al /usr/lib &#124; grep libevent<br/>rpm -qa&#124;grep libevent<br/>libevent-1.4.13-1<br/>libevent-devel-1.4.13-1<br/>libevent-devel-1.4.13-1<br/>libevent-1.4.13-1<br/><br/>rpm -e --allmatches --nodeps libevent-1.4.13-1 libevent-devel-1.4.13-1<br/>[root@test libevent-2.0.21-stable]# rpm -e --allmatches --nodeps libevent-1.4.13-1 libevent-devel-1.4.13-1<br/>[root@test libevent-2.0.21-stable]# <br/><br/>卸载后看还有没：<br/>[root@test libevent-2.0.21-stable]# ls -al /usr/lib &#124; grep libevent&nbsp;&nbsp;<br/>lrwxrwxrwx&nbsp;&nbsp; 1 root root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 31 Dec 30 17:17 libevent-1.1a.so.1 -&gt; /usr/lib/libevent-1.1a.so.1.0.2<br/>-rw-r--r--&nbsp;&nbsp; 1 root root&nbsp;&nbsp;&nbsp;&nbsp;31596 Jan&nbsp;&nbsp;7&nbsp;&nbsp;2007 libevent-1.1a.so.1.0.2<br/><br/>rm -Rf&nbsp;&nbsp;/usr/lib/libevent-1.1a.so.1.0.2 /usr/lib/libevent-1.1a.so.1 //删除干净<br/>[root@test libevent-2.0.21-stable]# rm -Rf&nbsp;&nbsp;/usr/lib/libevent-1.1a.so.1.0.2 /usr/lib/libevent-1.1a.so.1<br/>[root@test libevent-2.0.21-stable]# <br/><br/>cd /home/xiangdong/software/libevent-2.0.21-stable&nbsp;&nbsp;//最新安装包<br/>./configure --prefix=/usr&nbsp;&nbsp; //libevent会安装到 /usr/lib 或 /usr/local/lib 下<br/>#./configure --prefix=/usr/local/libevent-2.0.21-stable<br/>[root@test libevent-2.0.21-stable]# ./configure --prefix=/usr &amp;&amp; make &amp;&amp; make install<br/>测试libevent是否安装成功：ls -al /usr/lib &#124; grep libevent（或 ls -al /usr/local/lib &#124; grep libevent）<br/>ls -al /usr/lib &#124; grep libevent<br/>lrwxrwxrwx&nbsp;&nbsp; 1 root root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 21 Dec 31 09:44 libevent-2.0.so.5 -&gt; libevent-2.0.so.5.1.9<br/>-rwxr-xr-x&nbsp;&nbsp; 1 root root&nbsp;&nbsp;1065819 Dec 31 09:44 libevent-2.0.so.5.1.9<br/>-rw-r--r--&nbsp;&nbsp; 1 root root&nbsp;&nbsp;1678970 Dec 31 09:44 libevent.a<br/>lrwxrwxrwx&nbsp;&nbsp; 1 root root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 26 Dec 31 09:44 libevent_core-2.0.so.5 -&gt; libevent_core-2.0.so.5.1.9<br/><br/>如果libevent的安装目录为/usr/local/lib下，则还需要建立 libevent-1.4.so.2 到 /usr/lib 的软连接，这样其他程序运行时才能找到libevent库：ln -s /usr/local/lib/libevent-1.4.so.2&nbsp;&nbsp;/usr/lib/libevent-1.4.so.2<br/><br/> ls /usr/lib/libevent-2.0.so.5<br/>/usr/lib/libevent-2.0.so.5<br/><br/>干掉旧的libevent的残留的动态so文件：<br/>ls -al /usr/lib64 &#124; grep libevent <br/>lrwxrwxrwx&nbsp;&nbsp; 1 root root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 19 Dec 31 09:40 libevent-1.4.so.2 -&gt; libevent.so.bak.old<br/>-rwxr-xr-x&nbsp;&nbsp; 1 root root&nbsp;&nbsp; 104296 Dec 31 09:22 libevent.so.bak.old<br/>[root@test libevent-2.0.21-stable]# rm -Rf /usr/lib64/libevent-1.4.so.2 <br/>参考来自：http://blog.sina.com.cn/s/blog_4b93170a0100mbm9.html<br/><br/>编译成功结果如下：<br/><textarea name="code" class="php" rows="15" cols="100">
rm -Rf gearmand-1.1.12
tar -zxvf gearmand-1.1.12.tar.gz 
export CC=/usr/bin/gcc44
export CXX=/usr/bin/g++44
cd gearmand-1.1.12
./configure --with-sqlite3=/usr/local/sqlite3 --without-mysql&nbsp;&nbsp; --with-boost=/usr/local/boost-1.57&nbsp;&nbsp; --with-boost-libdir=/usr/local/boost-1.57/lib
 make &amp;&amp; make install
 ......
make[2]: Leaving directory `/home/xiangdong/software/gearmand-1.1.12&#039;
make[1]: Leaving directory `/home/xiangdong/software/gearmand-1.1.12&#039;
</textarea><br/><br/> 启动gearmand的方法：<br/>[root@test gearmand-1.1.12]# whereis gearmand<br/>gearmand: /usr/local/sbin/gearmand<br/>[root@test ~]# mkdir -p /usr/local/gearman/log<br/><br/> ls /usr/local/sqlite3/bin/<br/>sqlite3<br/><br/>*特别提醒，(mysql性能上可能在做队列上并不比sqlite强到哪儿去)<br/>使用sqlite更加简单方便 ：<br/>/usr/local/sbin/gearmand -l /usr/local/gearman/log/trace2.log --verbose INFO -p 4830 -q libsqlite3 --libsqlite3-db /usr/local/sqlite/bin/gearman --libsqlite3-table gearman_queue -d<br/>很遗憾，我到现在也没能编译出对MySQL的持久化<br/><br/>[root@test ~]# /usr/local/sbin/gearmand -l /usr/local/gearman/log/trace2.log --verbose INFO -p 4830 -q libsqlite3 --libsqlite3-db /usr/local/sqlite/bin/gearman --libsqlite3-table gearman_queue -d<br/>/usr/local/sbin/gearmand: Error while initializing the queue : libsqlite3<br/><br/>原来是sqlite的位置不对，修改路径后就OK了：<br/><textarea name="code" class="php" rows="15" cols="100">
/usr/local/sbin/gearmand -l /usr/local/gearman/log/trace2.log --verbose INFO -p 4830 -q libsqlite3 --libsqlite3-db /usr/local/sqlite3/bin/gearman --libsqlite3-table gearman_queue -d
</textarea><br/>启动成功：<br/>[root@test sqlite3]# /usr/local/sbin/gearmand -l /usr/local/gearman/log/trace2.log --verbose INFO -p 4830 -q libsqlite3 --libsqlite3-db /usr/local/sqlite3/bin/gearman --libsqlite3-table gearman_queue -d<br/>[root@test sqlite3]# <br/>端口存在了，说明是真的启动成功了：<br/>[root@test sqlite3]# netstat -atlunp&#124;grep 4830<br/>tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 0.0.0.0:4830&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.0.0.0:*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17820/gearmand&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>tcp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 :::4830&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :::*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LISTEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;17820/gearmand&nbsp;&nbsp; <br/><br/>也就是说gearmand启动时候自己建立一个sqlite的表，如下：<br/>[root@test sqlite3]# cat /usr/local/sqlite3/bin/gearman<br/>SQLite format 3@&nbsp;&nbsp;&#039;&#039;blegearman_queuegearman_queueCREATE TABLE gearman_queue ( unique_key TEXT, function_name TEXT, priority INTEGER, data BLOB, when_to_run INTEGER, PRIMARY KEY (unique_key, function_name))9M&#039;indexsqlite_autoindex_gearman_queue_1gearman_queue<br/><br/> 经过一陈折腾，说明这个gearmand对boost库的要求高，对libevent的版本也要求高，不是能经过yum install能解决得了的，得自己安装后指定，再就是对编译器的版本也是有要求的，也就是说相对来说其安装比较苛刻一些，如Lamp架构相比较的话，难度要高一些。<br/>——————————————————————————————————————————————————————————————<br/>总之，一大堆问题，这货居然还这么流行听说Gearman最初用于LiveJournal的图片resize功能，由于图片resize需要消耗大量计算资 源，因此需要调度到后端多台服务器执行，完成任务之后返回前端再呈现到界面。，看来广大分发系统还真得靠它啊，其它各种小问题不断，参考：<br/>http://www.111cn.net/sys/CentOS/65334.htm<br/><br/>二、PHP的gearmand扩展编译及遇到问题解决实践如下：<br/>PHP的gearmand折腾扩展，这块试了好几个版本的扩展要么configure不过去，要么是lib里却啥，但最后还是以当前最新的版本gearman-1.1.2.tgz给解决了：<br/><br/>./configure --with-php-config=/usr/local/php/bin/php-config <br/>出现如下所示的配置错误：<br/>configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.<br/>checking for gawk... gawk<br/>checking whether to enable gearman support... yes, shared<br/>found in /usr/local<br/>checking for gearman_create in -lgearman... no<br/>configure: error: wrong libgearman version or lib not found<br/><br/>问题一：<br/>gearman的PHP扩展时出现configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.警告信息。<br/>警告信息说明需要安装 re2c<br/>执行下面命令安装：<br/>wget http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download<br/>2014-12-31 11:01:59 (999 KB/s) - `re2c-0.13.5.tar.gz&#039; saved [782725/782725]<br/> tar -zxvf re2c-0.13.5.tar.gz <br/> cd re2c-0.13.5<br/>./configure &amp;&amp; make &amp;&amp; make install //安装成功，警告得到了解决，第二个依旧存在。<br/>它的意思是好像没有找到lib，不对是找到了没有找到里面的某个叫gearman_create的函数，这个就奇怪了，找下：<br/>[root@test /]# find . -name &quot;*gearman*.so*&quot;<br/>./usr/local/lib/libgearman.so.8.0.0<br/>./usr/local/lib/libgearman.so<br/>./usr/local/lib/libgearman.so.8<br/><br/>[root@test /]# vi /etc/ld.so.conf<br/>include ld.so.conf.d/*.conf<br/>/lib<br/>/lib64<br/>/usr/lib&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>/usr/lib64<br/>/usr/local/lib<br/>/usr/local/lib<br/>有这个位置的啊。<br/>[root@test /]# ldconfig&nbsp;&nbsp;//重新lib的位置载入。<br/><br/>[root@test gearman-0.4.0]# phpize <br/>Configuring for:<br/>PHP Api Version:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 20090626<br/>Zend Module Api No:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;20090626<br/>Zend Extension Api No:&nbsp;&nbsp; 220090626<br/>[root@test gearman-0.4.0]# ./configure --with-php-config=/usr/local/php/bin/php-config <br/><br/>问题依旧，去官网看一下呗，http://gearman.org/download/：<br/>文字摘录：PHP<br/>There are two PHP client/worker libraries, one which is a pure PHP extension and one which wraps the libgearman C library.<br/>Gearman Extension<br/>A PHP extension that wraps the libgearman C library.<br/>Gearman PHP Extension (1.0.2) (Source)<br/>官方的PHP扩展高V1.0.2，我这个是gearman-0.4.0太旧了，好像还有更高的gearman-1.1.2.tgz,http://pecl.php.net/package/gearman，放上官网这个上去重新试下了：<br/> tar -zxvf gearman-1.0.2.tgz <br/> cd gearman-1.0.2<br/> [root@test gearman-1.0.2]# phpize <br/> ./configure --with-php-config=/usr/local/php/bin/php-config&nbsp;&nbsp; //这个没有问题<br/> [root@test gearman-1.0.2]# make &amp;&amp; make install<br/> /home/xiangdong/software/gearman-1.0.2/php_gearman.c: In function ‘zm_startup_gearman’:<br/>/home/xiangdong/software/gearman-1.0.2/php_gearman.c:4638: error: ‘GEARMAN_MAGIC_TEXT’ undeclared (first use in this function)<br/>/home/xiangdong/software/gearman-1.0.2/php_gearman.c:4638: error: (Each undeclared identifier is reported only once<br/>还是差啥么子玩意，换个更新的看下，gearman-1.1.2.tgz 实践OK了，如下：<br/>Libraries have been installed in:<br/>&nbsp;&nbsp; /home/xiangdong/software/gearman-1.1.2/modules<br/><br/>If you ever happen to want to link against installed libraries<br/>in a given directory, LIBDIR, you must either use libtool, and<br/>specify the full pathname of the library, or use the `-LLIBDIR&#039;<br/>flag during linking and do at least one of the following:<br/>&nbsp;&nbsp; - add LIBDIR to the `LD_LIBRARY_PATH&#039; environment variable<br/>&nbsp;&nbsp;&nbsp;&nbsp; during execution<br/>&nbsp;&nbsp; - add LIBDIR to the `LD_RUN_PATH&#039; environment variable<br/>&nbsp;&nbsp;&nbsp;&nbsp; during linking<br/>&nbsp;&nbsp; - use the `-Wl,--rpath -Wl,LIBDIR&#039; linker flag<br/>&nbsp;&nbsp; - have your system administrator add LIBDIR to `/etc/ld.so.conf&#039;<br/><br/>See any operating system documentation about shared libraries for<br/>more information, such as the ld(1) and ld.so(8) manual pages.<br/>----------------------------------------------------------------------<br/><br/>Build complete.<br/>Don&#039;t forget to run &#039;make test&#039;.<br/><br/>[root@test gearman-1.1.2]# make install<br/>Installing shared extensions:&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/<br/>真在的：<br/> ls&nbsp;&nbsp;/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/gearman.so <br/>/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/gearman.so<br/>在php.ini里加上这个扩展就成了。Successful....EOF<br/><br/><br/>[root@test gearman-1.1.2]# php -v<br/>PHP 5.3.10 (cli) (built: Feb&nbsp;&nbsp;3 2012 14:04:56) <br/>Copyright (c) 1997-2012 The PHP Group<br/>Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies<br/>&nbsp;&nbsp;&nbsp;&nbsp;with eAccelerator v0.9.6.1, Copyright (c) 2004-2010 eAccelerator, by eAccelerator<br/><br/>[root@test gearman-1.1.2]# vi /usr/local/php/etc/php.ini<br/>extension = &quot;gearman.so&quot;&nbsp;&nbsp;<br/><br/>[root@test gearman-1.1.2]# php -m&#124;grep gearman<br/>gearman<br/><br/><br/><br/>三、代码编写task的分发及client的及简单代码实践OK及其情况实践Ok：<br/>cd /usr/local/gearman/<br/>[root@test gearman]# mkdir codesTest<br/>[root@test gearman]# cd codesTest/<br/>[root@test codesTest]# vi myworker.php<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
$worker = new GearmanWorker();
$worker-&gt;addServer(&#039;192.168.109.8&#039;, 4830);
$worker-&gt;addFunction(&#039;sayhello&#039;, function(GearmanJob $job)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;$name = $job-&gt;workload();
&nbsp;&nbsp;&nbsp;&nbsp;return &quot;hello, &quot; . $name;
&#125;);
$worker-&gt;addFunction(&#039;logMsg&#039;, function(GearmanJob $job)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;$msg = $job-&gt;workload();
&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents(__DIR__ . &#039;/Msg.log&#039;, $msg, FILE_APPEND);
&#125;);
while ($worker-&gt;work())&#123;
&nbsp;&nbsp;&nbsp;&nbsp;usleep(50000);
&#125;
</textarea><br/><br/>以守护进程方式启动worker:<br/># nohup php myworker.php &gt;/dev/null 2&gt;&amp;1 &amp;<br/>[root@test codesTest]# nohup php myworker.php &gt;/dev/null 2&gt;&amp;1 &amp;<br/>[1] 31238<br/><br/>一个发送任务处理请求的client:<br/>vi&nbsp;&nbsp;myclient.php <br/>[root@test codesTest]# vi&nbsp;&nbsp;myclient.php <br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
$name = $argv[1];
if (empty($name)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;Usage: $argv[0] &#123;name&#125;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&#125;
try &#123;
&nbsp;&nbsp;&nbsp;&nbsp;$client = new GearmanClient();
&nbsp;&nbsp;&nbsp;&nbsp;$client-&gt;addServer(&#039;192.168.109.8&#039;, 4830);
&#125; catch(Exception $e)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;oops&quot;, $e-&gt;getMessage();
&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&#125;
// 同步处理(Blocking),返回直接的处理结果
$result = $client-&gt;doNormal(&#039;sayhello&#039;, $name);
echo $result . PHP_EOL;

// 异步处理(Non-Blocking),仅返回一个处理状态的句柄
$job_handle = $client-&gt;doBackground(&#039;logMsg&#039;, $name);
echo $job_handle . PHP_EOL;
</textarea><br/><br/>运行myclient.php:<br/>[root@test codesTest]# php myclient.php &quot;Jose&quot;<br/>hello, Jose<br/>H:test.local:2<br/><br/>一个发出并行处理任务请求的例子tasksclient:<br/>[root@test codesTest]# vi&nbsp;&nbsp;tasksclient.php <br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
try &#123;
&nbsp;&nbsp;&nbsp;&nbsp;$client = new GearmanClient();
&nbsp;&nbsp;&nbsp;&nbsp;$client-&gt;addServer(&#039;192.168.109.8&#039;, 4830);
&#125; catch(Exception $e)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;oops&quot;, $e-&gt;getMessage();
&nbsp;&nbsp;&nbsp;&nbsp;exit(1);
&#125;
$client-&gt;setCompleteCallback(function(GearmanTask $task)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;echo &#039;Completed task:: id :&#039;, $task-&gt;unique(), &#039; , handled result:&#039;, $task-&gt;data(), PHP_EOL;
&#125;);
$client-&gt;addTask(&#039;sayhello&#039;, &#039;Jose&#039;, null, 1);
$client-&gt;addTask(&#039;sayhello&#039;, &#039;John&#039;, null, 2);
$client-&gt;addTaskBackground(&#039;logMsg&#039;, &#039;Peter&#039;);
$client-&gt;runTasks();
</textarea><br/><br/>运行tasksclient:<br/>[root@test codesTest]# php tasksclient.php <br/>Completed task:: id :2 , handled result:hello, John<br/>Completed task:: id :1 , handled result:hello, Jose<br/><br/>查看worker及队列情况:<br/> (echo &quot;workers&quot;; sleep 0.1) &#124; nc 192.168.109.8 4830<br/> [root@test codesTest]#&nbsp;&nbsp;(echo &quot;workers&quot;; sleep 0.1) &#124; nc 192.168.109.8 4830<br/>34 192.168.109.8 - : sayhello logMsg<br/>35 192.168.109.8 - :<br/>.<br/>查看当前队列情况(显示格式FUNCTION&#92;tTOTAL&#92;tRUNNING&#92;tAVAILABLE_WORKERS):<br/>(echo &quot;status&quot;; sleep 0.1) &#124; nc 192.168.109.8 4830<br/>[root@test codesTest]# (echo &quot;status&quot;; sleep 0.1) &#124; nc 192.168.109.8 4830<br/>sayhello&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br/>logMsg&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br/>.<br/><br/>监控php的守护进程（没实践）， 可以开多个，并同时监控：<br/>关于Worker守护进程的启动和监控<br/>上面例子中直接启动worker脚本作为守护进程,无法监控到worker进程是否存活.<br/>使用Unix进程监控supervisord则可轻松解决这个问题.<br/>将如下配置添加到supervisord的配置中,即可实现由supervisord来启动和监控myworker.<br/>编辑配置文件 vi /etc/supervisord.conf<br/>[program:myworker]<br/>command=/usr/local/php5415/bin/php myworker.php<br/>process_name=%(program_name)s_%(process_num)02d<br/>;修改numprocs即可同时开启多个worker进程<br/>numprocs=1 <br/>directory=/usr/local/gearman/codesTest<br/>autostart=true<br/>autorestart=true<br/>user=gearmand<br/>stopsignal=KILL<br/>Posted in Daemon / Worker, Gearman.<br/>Tagged gearman.<br/><br/>监控这块看：<br/>http://jingyan.baidu.com/article/375c8e198d1b1425f2a2290c.html<br/><br/>上面这块的PHP扩展代码及实践来自：<br/>http://www.51itstudy.com/30114.html<br/>http://codego.net/384693/<br/><br/>_________下面是摘录别的文章不一定自己配置时可完全过得过，得按自己环境作配置安装，只是用作参考！_______<br/>Gearman的目的在于用PHP扩展分发，于是PHP扩展如何安装：<br/>tar zxvf gearman-1.1.1.tgz<br/>cd gearman-1.1.1<br/>/opt/local/php/bin/phpize<br/>./configure --with-php-config=/opt/local/php/bin/php-config --with-gearman<br/>make<br/>make install<br/>编辑 php.ini<br/>vi php.ini<br/>增加<br/>extension = &quot;gearman.so&quot;<br/>重启php<br/><br/>启动gearmand 服务<br/>gearmand -L 10.6.0.6 -p 4730&nbsp;&nbsp;-u root -l /var/log/gearmand.log -d <br/>其他参数请&nbsp;&nbsp;gearmand --help<br/><br/>摘自：http://jicki.blog.51cto.com/1323993/1177487<br/><br/>通常，多语言多系统之间的集成是个大问题，一般来说，人们多半会采用WebService的方式来处理此类集成问题，但不管采用何种风格的WebService，如RPC风格，或者REST风格，其本身都有一定的复杂性。相比之下，Gearman也能实现类似的作用，而且更简单易用。<br/><br/>一个Gearman请求的处理过程涉及三个角色：Client -&gt; Job -&gt; Worker。<br/><br/>Client：请求的发起者，可以是C，PHP，Perl，MySQL UDF等等。<br/>Job：请求的调度者，用来负责协调把Client发出的请求转发给合适的Work。<br/>Worker：请求的处理者，可以是C，PHP，Perl等等。<br/><br/>因为Client，Worker并不限制用一样的语言，所以有利于多语言多系统之间的集成。<br/><br/>甚至我们通过增加更多的Worker，可以很方便的实现应用程序的分布式负载均衡架构。<br/><br/>下面看看如何安装运行一个例子，条件所限，我们把Client，Job，Worker三个角色运行在一台服务器上：<br/><br/>安装libevent：<br/>wget http://www.monkey.org/~provos/libevent-1.4.12-stable.tar.gz<br/>tar zxvf libevent-1.4.12-stable.tar.gz<br/>cd libevent-1.4.12-stable/<br/>./configure --prefix=/usr<br/>make &amp;&amp; make install<br/>/sbin/ldconfig<br/>cd ../<br/><br/> <br/><br/>安装Gearman server and library：<br/><br/>wget http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz<br/>tar zxvf gearmand-0.9.tar.gz<br/>cd gearmand-0.9<br/>./configure<br/>make<br/>make install<br/>/sbin/ldconfig<br/>cd ../<br/><br/><br/>安装Gearman PHP extension：<br/><br/>wget http://pecl.php.net/get/gearman-0.5.0.tgz<br/>tar zxvf gearman-0.5.0.tgz<br/>cd gearman-0.5.0<br/>/usr/local/webserver/php/bin/phpize<br/>./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-gearman<br/>make<br/>make install<br/>cd ../<br/><br/>编辑php.ini配置文件加载相应模块并使之生效：<br/><br/>extension = &quot;gearman.so&quot;<br/><br/>启动Job：<br/><br/>gearmand -d<br/><br/>如果当前用户是root的话，则需要这样操作：<br/><br/>gearmand -d -u root<br/><br/>缺省会使用4730端口，下面会用到。<br/><br/>注意：如果找不到gearmand命令的路径，别忘了用whereis gearmand确认。<br/><br/> <br/><br/>我们可以用 ps 指令來查看启动是否成功：<br/><br/>ps aux &#124;grep gearman<br/>编写Worker：<br/><br/>worker.php文件内容如下：<br/><br/>&lt;?php<br/>$worker= new GearmanWorker();<br/>$worker-&gt;addServer(&#039;127.0.0.1&#039;, 4730);<br/>$worker-&gt;addFunction(&#039;reverse&#039;, &#039;my_reverse_function&#039;);<br/><br/>while ($worker-&gt;work());<br/><br/>function my_reverse_function($job)<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return strrev($job-&gt;workload());<br/>&#125;<br/>?&gt; <br/><br/>设置后台运行work：<br/><br/>#php /var/www/html/worker.php &amp;<br/><br/>编写Client：<br/><br/>client.php文件内容如下：<br/><br/>&lt;?php<br/>$client= new GearmanClient();<br/>$client-&gt;addServer(&#039;127.0.0.1&#039;, 4730);<br/>echo $client-&gt;do(&#039;reverse&#039;, &#039;Hello World!&#039;), &quot;n&quot;;<br/>?&gt;<br/><br/>运行client：<br/><br/>#php /var/www/html/client.php<br/><br/>输出：!dlroW olleH<br/><br/> <br/><br/>首先， PHP Gearman Extension 提供了一个名为GearmanClient 的类别，它可以让程序安排工作给 Job Server 。<br/><br/>而 addServer 方法表示要通知的是哪些 Job Server ，也就是说如果有多台 Job Server 的话，就可以透过 addServer 新增。<br/><br/>然后我们将要呼叫哪个 Worker 以及该 Worker 所需要的数据，利用 GearmanClient 的doBackground 方法传送过去。 doBackground 方法顾名思义就是在背景执行， Client 在丢出需求后就可以继续处理其他的程序。<br/><br/>=============<br/><br/>$client-&gt;doBackground(&#039;sendEmail&#039;, serialize($emailData));<br/>echo &quot;Email sending is done.n&quot;;<br/><br/>============<br/><br/>doBackground 方法的第一个参数是告诉 Job Server 要执行哪个功能，而这个功能则是由 Worker 提供的；要注意是，这个参数只是识别用的，并不是真正的函式名称。而第二个参数是要传给 Worker 的数据，它必须是个字符串；因此如果要传送的是数组的话，我们就要用 PHP 的 serialize 函式来对这些资料做串行化。<br/><br/>出于方便的考虑，Worker，Client使用的都是PHP，但这并不影响演示，实际应用中，你完全可以通过Gearman集成不同语言实现的Worker，Client。或许此时你还想了解前面提到的负载均衡功能：很简单，只要增加多个Worker即可，你可以按照worker.php的样子多写几个类似的文件，并设置不同的返回值用以识别演示效果。然后依次启动这几个Worker文件，并多次使用client.php去请求，你就会发现Job会把Client请求转发给不同的Worker。<br/><br/>以守护进程启动<br/>gearmand -L 192.168.0.1 -p 4730 -u root -d<br/><br/>命令行工具<br/><br/>如果你觉得安装PHP之类的东西太麻烦的话，你也可以仅仅通过命令行工具来体验Gearman的功能：<br/><br/>启动Worker：gearman -w -f wc -- wc -l &amp;<br/>运行Client：gearman -f wc &lt; /etc/passwd<br/><br/>具体可以参考官方文档。<br/>摘自：http://www.codesky.net/article/201107/174139.html<br/>安装时会出现一个小问题：<br/>configure出现以下错误 checking for gperf... no configure: error: could not find gperf. 解决办法： #yum search gperf #yum install gperf.x86_64.<br/>gperf.x86_64 : A perfect hash function generator.<br/><br/>Gearman 安装使用 以及 问题处理&nbsp;&nbsp;<br/>http://deapge.blog.163.com/blog/static/1113114792013929380253<br/><br/><br/>gearman.h:53:23: error: cinttypes: No such file or directory<br/>tr1/cinttypes: No such file or directory<br/>错误代码：<br/>make[1]: Entering directory `/usr/local/src/gearmand-0.38&#039;<br/>&nbsp;&nbsp;CXX&nbsp;&nbsp;&nbsp;&nbsp;libgearman/libgearman_libgearman_la-actions.lo<br/>In file included from ./libgearman/common.h:44,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from libgearman/actions.cc:39:<br/>./libgearman-1.0/gearman.h:53:27: error: tr1/cinttypes: No such file or directory<br/>make[1]: *** [libgearman/libgearman_libgearman_la-actions.lo] Error 1<br/>make[1]: Leaving directory `/usr/local/src/gearmand-0.38&#039;<br/>解决：[root@localdomain gearmand-0.38]# yum install gcc44 gcc44-c++<br/>来自google快照：https://webcache.googleusercontent.com/search?q=cache:GhqVv51gppAJ:www.livingelsewhere.net/2012/08/22/gearman-instal/+&amp;cd=1&amp;hl=zh-CN&amp;ct=clnk&amp;gl=cn<br/>google来自：http://www.livingelsewhere.net/2012/08/22/gearman-instal/<br/><br/>解决./libgearman-1.0/gearman.h:53:23: error: cinttypes: No such file or directory 实践OK如下：<br/>后补来自：http://blog.slogra.com/post-234.html<br/>如果出现configure: error: Unable to find libevent,则输入命令:<br/>yum -y install libevent libevent-devel<br/>然后重新configure.<br/>没有问题后再执行<br/>make<br/>这步出现./libgearman-1.0/gearman.h:53:27: error: tr1/cinttypes: No such file or directory错误,可以推断是gcc编译器的问题,执行命令:<br/>yum install gcc44 gcc44-c++ libstdc++44-devel -y<br/>然后在环境变量里加入:<br/>export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc<br/>export CXX=/usr/bin/g++44<br/><br/>看来还得重新export一次新的编译器，因为昨天的关了终端，今天的又没了：<br/> export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc&nbsp;&nbsp;//这行有问题~<br/> export CXX=/usr/bin/g++44<br/> g++ -o testmemcached testmemcached.cpp -lmemcached<br/>为何还是不行？<br/> echo $CC<br/>/usr/bin/gcc&nbsp;&nbsp;//没变，这儿有问题，再重新设置一次，查到上面这个or有问题：export CC=/usr/bin/gcc44。<br/># echo $CXX<br/>/usr/bin/g++44 //变了<br/><br/>重新设置，好了：<br/>export CC=/usr/bin/gcc44<br/>/usr/bin/gcc44<br/><br/>保存退出后执行:<br/>source /etc/profile<br/>删除gearmand-0.34文件夹重新进行编译.<br/>重新进行编译后执行make这步,如图<br/>点击查看原图<br/>没有报错的话才能继续执行<br/>make install<br/>如果没有报错的话,那么恭喜你可以继续安装gearman了.<br/><br/>看下yum后新的gcc在不在，在的：<br/>yum install gcc44 gcc44-c++ libstdc++44-devel -y<br/><textarea name="code" class="php" rows="15" cols="100">
[root@test software]# ls /usr/bin/gcc44
/usr/bin/gcc44
[root@test software]# ls /usr/bin/gcc
/usr/bin/gcc
[root@test software]# ls /usr/bin/g++44
/usr/bin/g++44

export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc
export CXX=/usr/bin/g++44

看来还得重新export一次新的编译器，因为昨天的关了终端，今天的又没了：
 export CC=/usr/bin/gcc44 or export CC=/usr/bin/gcc&nbsp;&nbsp;//这行有问题~
 export CXX=/usr/bin/g++44
 g++ -o testmemcached testmemcached.cpp -lmemcached
为何还是不行？
 echo $CC
/usr/bin/gcc&nbsp;&nbsp;//没变，这儿有问题，再重新设置一次，查到上面这个or有问题：export CC=/usr/bin/gcc44。
# echo $CXX
/usr/bin/g++44 //变了

重新设置，好了：
export CC=/usr/bin/gcc44
/usr/bin/gcc44
</textarea><br/>Total download size: 4.1 M<br/>Downloading Packages:<br/>libstdc++44-devel-4.4.7-1.el5.i386.rpm&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 4.1 MB&nbsp;&nbsp;&nbsp;&nbsp; 00:00&nbsp;&nbsp;&nbsp;&nbsp; <br/>Transaction Test Succeeded<br/>Running Transaction<br/>&nbsp;&nbsp;Installing&nbsp;&nbsp;&nbsp;&nbsp; : libstdc++44-devel&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1/1 <br/>Installed:<br/>&nbsp;&nbsp;libstdc++44-devel.i386 0:4.4.7-1.el5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>Complete!<br/><br/>方法二：<br/>http://www.cnblogs.com/cenalulu/archive/2013/04/03/2998140.html<br/>关键信息：error: tr1/cinttypes: No such file or directory<br/><br/>报错原因：libmemcached需要 gcc 4.2 以上版本才可编译，而centos 5.4 的gcc版本只有4.1 ，详见：https://bugs.launchpad.net/libmemcached/+bug/1076181<br/><br/>解决方法：安装gcc44的扩展包，详见：http://gearman.info/build/centos5-8.html<br/><br/>解决步骤引用如下：<br/><br/>wget http://mirrors.ustc.edu.cn/fedora/epel/5/i386/epel-release-5-4.noarch.rpm<br/>rpm -ivh epel-release-5-4.noarch.rpm<br/>yum -y -q install boost141-devel<br/>ln -s /usr/include/boost141/boost/ /usr/include/boost<br/>export LDFLAGS=&quot;-L/usr/lib64/boost141&quot;<br/>export LD_LIBRARY_PATH=/usr/lib64/boost141:$LD_LIBRARY_PATH<br/>yum -y -q install e2fsprogs-devel e2fsprogs<br/>yum -y -q install gcc44 gcc44-c++<br/>export CC=&quot;gcc44&quot;<br/>export CXX=&quot;g++44&quot;<br/><br/> 所有操作完成后，重新执行：<br/><br/>./configure --enable-memaslap &amp;&amp; make &amp;&amp; make install<br/><br/>安装完成！！<br/><br/> 实践如下问题：<br/>[root@test software]# rpm -ivh epel-release-5-4.noarch.rpm<br/>rpm: error while loading shared libraries: libbeecrypt.so.6: cannot open shared object file: No such file or directory<br/><br/><br/>http://pecl.php.net/package/gearman<br/>http://sourceforge.net/projects/boost/?source=pdlp<br/>提示没有安装boost libraries，那么安装之。<br/>下载地址：http://sourceforge.net/projects/boost/?source=pdlp<br/>关于boost的了解，可以到官网：<br/>http://www.boost.org/doc/libs/1_55_0/more/getting_started/index.html<br/>http://www.boost.org/doc/libs/1_55_0/more/getting_started/windows.html<br/> <br/>Boost库的安装步骤参照：(漫长的编译过程……)<br/>Linux下安装gearman的方法：<br/>https://jackxiang.com/post/7706/<br/>————————————————————————————————————————<br/>http://www.cnblogs.com/longcpp/archive/2012/06/06/2538251.html<br/>还有http://m.blog.csdn.net/blog/yan420523/9096871(……晕晕呼呼)<br/>http://www.cnblogs.com/cocowool/archive/2011/08/18/2144142.html<br/>接着重新执行上面的./configure<br/>又出现错误了:<br/> <br/>http://www.cnblogs.com/youlechang123/archive/2013/10/22/3382425.html<br/>用apt-get install gperf安装了gperf，重新执行./configure，执行一段时间，又出错了：<br/> =====================================================================<br/>重点参考：http://blog.chinaunix.net/uid-27177626-id-4325909.html<br/><br/>参照http://blog.slogra.com/post-234.html解决<br/>用apt-get install libevent libevent-devel安装缺少的依赖，但是又出错了：ubuntu E: Unable to locate package libevent<br/>更新源：apt-get apdate&nbsp;&nbsp;apt-get upgrade<br/>还是无法安装libevent，只有去官网下载，用源码安装方式安装：http://libevent.org/<br/>下载之后，./configure make make install<br/>重新执行./configure，执行一段时间，又出错：<br/> <br/>用apt-get install libuuid无法安装，因此，只有去官网下载：<br/>http://sourceforge.net/projects/libuuid/<br/>用源码安装方式安装。<br/>然后，再次重新执行gearman目录下的./configure。呼呼~~~~~，终于不再出错了，这次顺利执行完毕。<br/><br/>Boost DownLoad:<br/>http://jaist.dl.sourceforge.net/project/boost/boost/1.57.0/boost_1_57_0.zip
]]>
</description>
</item><item>
<link>http://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]CentOS的Gearman安装与使用无错版,包含PHP的gearmand扩展,包括安装Gearmand及其PHP扩展，及简单task/worker，相当不容易。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>