<?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/5028/</link>
<title><![CDATA[为PHP增加SVN扩展,不让PHP退出的启动方法：/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid 。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Tue, 28 Feb 2012 07:40:16 +0000</pubDate> 
<guid>http://jackxiang.com/post/5028/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp; 最近的一个项目需要PHP与SVN交互，最先想到的解决方案是用PHP的SVN扩展，搜了已经有PHP的SVN扩展，这两天也去http:/pecl.php.net/package/svn 上面下载了SVN扩展的源码.【备注：比如我看到php的subversion扩展是有的, 不过手册里写的却是试用阶段. 应该不如python的成熟. 何况...我觉得这种事情确实应该让python干, 就像web的事情应该让php干一样.http:/blog.csdn.net/akara/article/details/5566524】<br/><br/>为PHP增加SVN扩展:<br/>http:/www.swordair.com/blog/2010/01/85<br/><textarea name="code" class="html" rows="15" cols="100">
phpize
./configure
make;make install
</textarea><br/><br/>Installing shared extensions:&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/ successed<br/>至此，终于通过编译，并在完成的最后提示在php.ini中增加一行：<br/><textarea name="code" class="html" rows="15" cols="100">
extension=svn.so
</textarea><br/>版本比较差异，这样导出差异文件，后覆盖线上即可：<br/>svn diff -r m:n path(对版本m和版本n比较差异) <br/>例如：svn diff -r 200:201 test.php <br/>简写：svn di <br/><br/>svn diff -r 版本号1：版本号2&nbsp;&nbsp;工作拷贝文件地址 &gt;&nbsp;&nbsp;保存差异文件<br/>例：<br/>svn diff -r PREV:COMMITTED&nbsp;&nbsp;./project/trunk/helloworld.c&nbsp;&nbsp;&gt; patch.c<br/>写一个脚本测试一下，成功。<br/>----------------------------------------------------------------------------------------------------<br/>svn diff 比较两个目录:<br/>svn diff --summarize http://rep_url/tags/proj1_090214 http://rep_url/trunk/proj1 &gt;diff.txt<br/>这个命令比较了 proj1_090214 和 proj1 的差异，并将差异信息输出到文件 diff.txt<br/>summarize&nbsp;&nbsp; 选项的含义是只显示结果的概要，不显示文件的具体差异。<br/>---------------------------------------------------------------------------------------------------<br/>这样也成:<br/>svn diff -r 3797:3788 --summarize https://tc-svn.XXXX.com/web/CCCC/web_aXc_proj/trunk&nbsp;&nbsp;<br/><br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?php
svn_checkout(&#039;https:/tc-svn.jackxiang.com/XXXX/trunk/tst&#039;, dirname(__FILE__) . &#039;/tst&#039;);
?&gt;
</textarea><br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?php
list($diff, $errors) = svn_diff(
&nbsp;&nbsp;&nbsp;&nbsp;&#039;https:/tc-svn.jackxiang.com/web_xxx_proj/trunk/task&#039;, 3370,
&nbsp;&nbsp;&nbsp;&nbsp;&#039;https:/tc-svn.jackxiang.com/web_xxx_proj/trunk/task&#039;,3373
);
if (!$diff) exit;
$contents = &#039;&#039;;
while (!feof($diff)) &#123;
&nbsp;&nbsp;$contents .= fread($diff, 8192);
&#125;
fclose($diff);
fclose($errors);
var_dump($contents);
?&gt;
</textarea><br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
function svn_diff_same_item($path, $rev1, $rev2) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;return svn_diff($path, $rev1, $path, $rev2);
&#125;
?&gt; 

</textarea><br/><br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?php
$working_dir&nbsp;&nbsp;&nbsp;&nbsp; = &#039;../&#039;;
$new_working_dir = &#039;/home/user/devel/foo/trunk&#039;;

svn_export($working_dir, $new_working_dir);
?&gt; 

</textarea><br/><br/><br/>下面是给svn设置用户名密码来访问，特别是ssl这块否则在终端是可以的，但是在apache加载后会报错：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
Error_reporting(E_ALL);
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_USERNAME,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;jackxiang&#039;);
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_PASSWORD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;123QWEzxcqw*&#039;);
svn_auth_set_parameter(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true); // &lt;--- Important for certificate issues!
svn_auth_set_parameter(SVN_AUTH_PARAM_NON_INTERACTIVE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true);
svn_auth_set_parameter(SVN_AUTH_PARAM_NO_AUTH_CACHE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true);
print_r(svn_log(&#039;https:/tc-svn.jackxiang.com/web_xxx_proj/trunk/&#039;, 3344, 3373));
?&gt;
</textarea><br/><br/>通过svn list 导出该目录下所有的文件。<br/>svn list -R&nbsp;&nbsp;http:/192.168.1.11/svn/reponame/J2EE11 &#124; wc -l <br/><br/>http:/192.168.1.11/svn 是 svn server 的root&nbsp;&nbsp;/reponame 是库 /J2EE11 是路径<br/><br/>这样会包括 目录<br/><br/>过滤目录<br/>svn list -R&nbsp;&nbsp;svn_server_addr/svnrepo/folder&nbsp;&nbsp;&#124; grep -v &#92;/$ &#124; wc -l<br/><br/>请在 linux 下运行 win 平台可以装cygwin .<br/>获取目录的函数实践：<br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?php
$folder_file_arr&nbsp;&nbsp;=&nbsp;&nbsp;svn_ls(&#039;https:/tc-svn.jackxiang.com/web/trunk&#039;,false);
$folderAll = array();
foreach($folder_file_arr as $k =&gt;$v)
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if($v[&#039;type&#039;] == &quot;dir&quot;)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$folderAll[] = $v[&#039;name&#039;];
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&#125;
print_r($folderAll);
?&gt;
</textarea><br/>查询版本下的注释：<br/><textarea name="code" class="php" rows="15" cols="100">
print_r(svn_log(&#039;https:/tc-svn.XXXX.com/web/trunk/&#039;, 3365) );
print_r(svn_log(&#039;https://tc-svn.tencent.com/web/web_webitil_rep/web_adc_proj/trunk/&#039;) );
print_r(svn_log(&#039;https:/tc-svn.jackxiang.com/web_xxx_proj/trunk/task&#039;, 3344, 3372)); //这儿3372这个版本获取不到，注意。
</textarea><br/>Please not that using svn_log without giving revisions is much, much slower then with revisions. Examples:<br/><br/>$ time php -r &quot;svn_log(&#039;http://localhost/svn/shopadsl&#039;);&quot;<br/><br/>real&nbsp;&nbsp;&nbsp;&nbsp;0m2.140s<br/>user&nbsp;&nbsp;&nbsp;&nbsp;0m0.140s<br/>sys&nbsp;&nbsp;&nbsp;&nbsp; 0m0.000s<br/><br/>VS<br/><br/>$ time php -r &quot;svn_log(&#039;http://localhost/svn/shopadsl&#039;, 0, 45);&quot;<br/><br/>real&nbsp;&nbsp;&nbsp;&nbsp;0m0.063s<br/>user&nbsp;&nbsp;&nbsp;&nbsp;0m0.024s<br/>sys&nbsp;&nbsp;&nbsp;&nbsp; 0m0.016s<br/><br/>默认svn在linux下的密码位置参考：http:/jackxiang.com/post/4512/<br/><br/>更多使用方法：http:/www.php.net/manual/en/function.svn-checkout.php<br/>重启Apache<br/>[plain] view plaincopy<br/>/etc/init.d/apache2 reload&nbsp;&nbsp;<br/>或php-fpm 重启：<br/>[plain] view plaincopy<br/>kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`&nbsp;&nbsp;<br/><br/>发现在Apache启动后会报错，解决方法如下：<br/>If you having trouble with certificate verification like this:<br/><br/>PHP Warning:&nbsp;&nbsp;svn_log(): svn error(s) occured 175002 (RA&nbsp;&nbsp;layer request failed) OPTIONS of &#039;https://example.com/your/repos/path&#039;: Server certificate verification failed: issuer is not trusted<br/><br/>Try this two steps:<br/><br/>1. Run<br/><br/>&quot;svn log https://example.com/your/repos/path&quot;<br/><br/>on the commandline and permanent accept the certificate by typing &quot;p&quot; when asked.<br/><br/>2. Use the following settings for svn_auth_set_parameter() before calling other svn functions:<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_USERNAME,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;your svn user&#039;);
svn_auth_set_parameter(SVN_AUTH_PARAM_DEFAULT_PASSWORD,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#039;your svn users password&#039;);
svn_auth_set_parameter(PHP_SVN_AUTH_PARAM_IGNORE_SSL_VERIFY_ERRORS, true); // &lt;--- Important for certificate issues!
svn_auth_set_parameter(SVN_AUTH_PARAM_NON_INTERACTIVE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true);
svn_auth_set_parameter(SVN_AUTH_PARAM_NO_AUTH_CACHE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true);

var_dump(svn_log(&#039;https://example.com/your/repos/path&#039;));
?&gt; 
</textarea><br/><br/>当然，也可以直接用PHP的Popen：<br/>popen()这个函数， 看来echo t &#124; svn ci ...那些命令可以用另外的方式来解决了<br/><br/>附转：<br/><br/>popen()函数打开一个进程管道来执行给定的命令，返回一个文件句柄。既然返回的是一个文件句柄，那么就可以对它读和写了。在PHP3中，对这种句柄只能做单一的操作模式，要么写，要么读；从PHP4开始，可以同时读和写了。除非这个句柄是以一种模式（读或写）打开的，否则必须调用pclose()函数来关闭它。<br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?
/* PHP中如何增加一个系统用户
下面是一段例程，增加一个名字为james的用户,
root密码是 verygood。仅供参考
*/
$sucommand = &quot;su --login root --command&quot;;
$useradd = &quot;useradd &quot;;
$rootpasswd = &quot;verygood&quot;;
$user = &quot;james&quot;;
$user_add = sprintf(&quot;%s &#92;&quot;%s %s&#92;&quot;&quot;,$sucommand,$useradd,$user);
$fp = @popen($user_add,&quot;w&quot;);
@fputs($fp,$rootpasswd);
@pclose($fp);
?&gt;
</textarea><br/><br/>常用操作<br/>1.查看最近3个版本日志<br/>svn log [PATH] -v -l3<br/><br/>2.查看某两个版本，用来对比<br/>svn log -r 14:15<br/><br/>3.日志放入文件<br/>$ svn log -r 14 &gt; mylog<br/>$ svn log -r 19 &gt;&gt; mylog<br/>$ svn log -r 27 &gt;&gt; mylog<br/>$ cat mylog<br/><br/>或者<br/>$ svn log –incremental -r 14 &gt; mylog<br/>$ svn log –incremental -r 19 &gt;&gt; mylog<br/>$ svn log –incremental -r 27 &gt;&gt; mylog<br/>$ cat mylog<br/><br/>参考：http:/www.php.net/manual/en/function.svn-checkout.php<br/>你也可以参考：http:/blog.csdn.net/dragon8299/article/details/6689685<br/>http:/www.swordair.com/blog/2010/01/85<br/>http:/biancheng.dnbcw.info/win2003/377268.html<br/><br/><br/>如果configure报下面的错<br/>checking for svn includes... configure: error: failed to find svn_client.h<br/>安装libsvn-dev包：CentOs应该也有对应的包<br/>apt-get install libsvn-dev<br/><br/><br/>解压缩后 切换到安装目录 执行/opt/lamp/php/bin/phpize<br/>然后：./configure –with-php-config=/opt/lamp/php/bin/php-config <br/>出现错误：checking for svn includes… configure: error: failed to find svn_client.h<br/>解决办法：添加subversion服务端的目录 –with-svn=/usr/local/subversion<br/>./configure –with-php-config=/opt/lamp/php/bin/php-config&nbsp;&nbsp;–with-svn=/usr/local/subversion<br/><br/>make出错：<br/>/usr/bin/ld: cannot find -lsvn_client-1<br/><br/>ok<br/><br/><br/><br/><br/>===================================================================<br/>在Tlinux的64位机器上折腾步骤记录，我艹，比Cenots折腾了更多时间来整这个玩意，真是步步惊心啊，如下：<br/>第一步：编译，参数如下 ，这个参数都折腾了老半天啊。<br/>./configure --with-php-config=/usr/local/qqwebsrv/php/bin/php-config&nbsp;&nbsp;--with-svn=/opt/CollabNet_Subversion --with-svn-apr=/usr/local/apr<br/>中间就会提示找不到什么.h啊：checking for svn includes... configure: error: failed to find svn_client.h，于是得找个这个h的包放在里面去才行。<br/>root@10.12.21.108:~/software/svn-1.0.2# ls /usr/local/include/<br/>subversion-1&nbsp;&nbsp;subversion-1.tar.gz<br/><br/>第二步：/usr/local/apr-util/include/apr-1 这个Include进Makefile里。<br/>修改Makefile： 39行左右<br/>39 INCLUDES = -I/usr/local/qqwebsrv/php/include/php -I/usr/local/qqwebsrv/php/include/php/main -I/usr/local/qqwebsrv/php/includ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e/php/TSRM -I/usr/local/qqwebsrv/php/include/php/Zend -I/usr/local/qqwebsrv/php/include/php/ext -I/usr/local/qqwebsrv/php/in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clude/php/ext/date/lib -I/usr/local/include/subversion-1 -I/usr/local/apr/include/apr-1 -I/usr/local/apr-util/include/apr-1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -DLINUX=2 -D_REENTRANT -D_GNU_SOURC<br/>加入：/usr/local/apr-util/include/apr-1<br/>-I/usr/local/apr/include/apr-1 -I/usr/local/apr-util/include/apr-1<br/><br/>第三步：出现老是什么 cannot find -lsvn_client-1&nbsp;&nbsp;,做软链接后，出现下一个，太多了，于是否，如下：<br/>全拷贝过去得了，注意：/opt/CollabNet_Subversion 这个是在网上找的整个包进行安装的SVN，是Rpm包。<br/>cp -Rf /opt/CollabNet_Subversion/lib/*&nbsp;&nbsp;/usr/lib/<br/>make<br/>make install<br/>root@10.12.22.108:~/software/svn-1.0.2# make install<br/>Installing shared extensions:&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/qqwebsrv/php/lib/extensions/<br/><br/><br/>第四步：因发现在加入这个扩展后，出现：libsvn_client-1.so.0 cannot open shared object file no such file or directory<br/>root@10.12.22.108:/# /sbin/ldconfig<br/>/sbin/ldconfig: libraries libsasl2.so.2.0.21 and libsasl2.so.2.0.23 in directory /usr/lib have same soname but different type.<br/>/sbin/ldconfig: libraries libgz.so.1 and libz.so.1.2.5 in directory /usr/lib have same soname but different type.<br/>ldconfig: /usr/lib/libsvn_client-1.so.0 is not a symbolic link<br/>根据上面的提示，于是删除掉这个文件：<br/>rm -Rf&nbsp;&nbsp;/usr/lib/libsvn_client-1.so.0<br/>上面两个不管它，就这样就好了。<br/><br/>第五步（经实践是多余的）：<br/>查找网上文章：http://www.cnblogs.com/amboyna/archive/2008/02/06/1065322.html<br/>vi /etc/ld.so.conf <br/>加上：<br/><textarea name="code" class="html" rows="15" cols="100">
/usr/local/lib
ldconfig
</textarea><br/>再运行这个PHP的SVN扩展，好了。前面的libsasl2，libgz，删除高版本的，做个软链接就Ok了。<br/><br/>但是TLamp有问题了，Apache出现了：<br/>[codes=html]<br/>Apache2 has detected a syntax error in your configuration files:<br/>apache2: Syntax error on line 142 of /etc/apache2/httpd.conf: Cannot load /usr/lib64/apache2/modules/mod_ssl.so into server: /usr/lib64/apache2/modules/mod_ssl.so: undefined symbol: SSL_CTX_set_client_cert_cb<br/>[codes=html]<br/>于是，自己重新下了一个Apache，PHP5.3.11等，重新编译后，这个问题也就没有了，直接访问SVN扩展输出Ok了，还以为需要用system或者popen去打开呢，看来用不着了。<br/><br/>为了安全把一些函数都给屏蔽了，在php.ini里可以看到：<br/>[codes=html]<br/>disable_functions = passthru,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,system,exec<br/>[codes=html]<br/>因只为了这个svn扩展，PHP5.3.11的编译也很简单，如下：<br/>./configure --prefix=/usr/local/php --with-apxs2=/usr/local/httpd-2.0.59/bin/apxs&nbsp;&nbsp; --enable-sockets --enable-mbstring<br/><br/>原本想加入其它的，现在想来，没有必要加上什么Mysql，Pdo，Mbstring等等。<br/>（./configure --prefix=/usr/local/php --with-apxs2=/usr/local/httpd-2.0.59/bin/apxs&nbsp;&nbsp;--with-pdo=shared --with-pdo-mysql=/usr/local/mysql --enable-sockets --enable-mbstring）<br/><br/>EOF
]]>
</description>
</item><item>
<link>http://jackxiang.com/post/5028/#blogcomment63683</link>
<title><![CDATA[[评论] 为PHP增加SVN扩展,不让PHP退出的启动方法：/usr/local/php/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php/etc/php-fpm.conf --pid /usr/local/php/var/run/php-fpm.pid 。]]></title> 
<author>ahcznkyy &lt;404289039@qq.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 23 Mar 2012 00:30:10 +0000</pubDate> 
<guid>http://jackxiang.com/post/5028/#blogcomment63683</guid> 
<description>
<![CDATA[ 
	新手学习中，谢谢楼主分享！！！
]]>
</description>
</item>
</channel>
</rss>