<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>生活点滴 &#187; PHP</title>
	<atom:link href="http://www.storyday.com/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.storyday.com</link>
	<description>生活点滴、旅游、web技术、虚拟主机、电子信息</description>
	<lastBuildDate>Wed, 08 Feb 2012 05:54:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>一个简单自动监控nginx 504错误的php脚本</title>
		<link>http://www.storyday.com/html/y2011/3095_php-nginx504-check.html</link>
		<comments>http://www.storyday.com/html/y2011/3095_php-nginx504-check.html#comments</comments>
		<pubDate>Tue, 22 Nov 2011 03:39:59 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=3095</guid>
		<description><![CDATA[因为php连接网络超时，很容易导致nginx 504错误，网络上有很多解决办法，但是不知道为啥在我这里都不奏效。 所以我只好写一个脚本，定期检测我的站点是否504了，若有504，只好出绝招“重启nginx和php-fpm”， 具体代码如下： #!/usr/bin/php 是你的php路径 #!/usr/bin/php &#60;?php error_reporting(E_ERROR); define("EMAIL","xxx@gmail.com");//你的email地址 define("TIMEOUT",5);//读取网站超时时间，5秒 function curl_get($url){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, TIMEOUT); // Headers $headers = array(); $headers[] = "Date: ".date('r'); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); $Data = curl_exec($curl); return $Data ; } function check($d,$k){ $url = $d;//"http://".$d; $html = curl_get($url); if( substr_count($html,$k) &#38;lt; [...]]]></description>
			<content:encoded><![CDATA[<p>因为php连接网络超时，很容易导致nginx 504错误，网络上有很多<a href="http://stackoverflow.com/questions/561946/how-do-i-prevent-a-gateway-timeout-with-nginx">解决办法</a>，但是不知道为啥在我这里都不奏效。</p>
<p>所以我只好写一个脚本，定期检测我的站点是否504了，若有504，只好出绝招“重启nginx和php-fpm”，</p>
<p>具体代码如下：<br />
#!/usr/bin/php 是你的php路径<span id="more-3095"></span></p>
<pre>#!/usr/bin/php
&lt;?php
error_reporting(E_ERROR);
define("EMAIL","xxx@gmail.com");//你的email地址
define("TIMEOUT",5);//读取网站超时时间，5秒
function curl_get($url){
                $curl = curl_init();
                curl_setopt($curl, CURLOPT_URL, $url);
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
                curl_setopt($curl, CURLOPT_TIMEOUT, TIMEOUT);
                // Headers
                $headers = array();
                $headers[] = "Date: ".date('r');
                curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
                $Data = curl_exec($curl);
                return $Data ;

}

function check($d,$k){
        $url = $d;//"http://".$d;
        $html = curl_get($url);
        if( substr_count($html,$k) &amp;lt; 1){
                mail(EMAIL,"JP 504 timeout for ".$d,$html);
                exec("/etc/init.d/nginx restart "); //重启nginx
                exec("/etc/init.d/php-fpm restart");//重启php-fpm
        }
}

check("https://www.homezz.com","homezz.com");
?&gt;</pre>
<p>将该文件命名为 504check.php<br />
修改权限 chmod +x 504check.php<br />
然后crontab -e添加一行<br />
* * * * * /xx/504check.php &gt;/dev/null 2&gt;&amp;1<br />
每分钟系统就会自动检测网站是否响应很慢，若如此，则重启</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2011/3095_php-nginx504-check.html/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>防止php fsocksopen函数发起DoS攻击的一个思路</title>
		<link>http://www.storyday.com/html/y2011/3093_php-dos-solution.html</link>
		<comments>http://www.storyday.com/html/y2011/3093_php-dos-solution.html#comments</comments>
		<pubDate>Fri, 18 Nov 2011 03:49:57 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[互联网事]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=3093</guid>
		<description><![CDATA[前段时间，因为某些用户的dedecms程序被黑，被黑的脚本利用php的fsocksopen对外发起DoS攻击，所以我不得不禁止fsockopen函数，实际上，很多国内国外的主机商都是禁止这个函数的。 实际上，多数情况下fsocksopen可以用curl替代之，后者更加安全，然后依然有部分程序，如aksimet反垃圾插件，discuz论坛都需要fsocksopen来支持，所以如果可能，我觉得还是打开fsocksopen函数比较人道。 因此，我想到了一个方案，不知道是否可行： 写了一个脚本，定期扫描用户的文件，专门揪出那些有fsocksopen函数的文件，同时看看是否有被黑的标志，如果有，则标记为可疑文件； 用iptables监控流量，1分钟一次，如果发现outbound流量异常，则dump下当前的所有进程，以供后期人工排除查看； 将进程中的php文件 和可疑文件列表相对照，如果有吻合的文件，马上kill掉进程，同时将此文件属性标记为000，并且邮件通知； 当然，上面的1，2，3将会用脚本自动完成 。 这仅仅是一个想法，等到测试确实可能之后，homezz将会再次支持fsocksopen函数 发现一个问题： 若用户的php脚本进行了简单的base64加密，判断难度增加； 若php脚本进行了其他方式的加密，则无法扫描； 所以，目前还是有无法开启fsocksopen 此种方案不太完美]]></description>
			<content:encoded><![CDATA[<p>前段时间，因为某些用户的dedecms程序被黑，被黑的脚本利用php的fsocksopen对外发起DoS攻击，所以我不得不<a title="homezz为何要禁止fsockopen" href="http://www.storyday.com/html/y2011/3078_homezz-dis-fsocksopen.html">禁止fsockopen</a>函数，实际上，很多国内国外的主机商都是禁止这个函数的。</p>
<p>实际上，多数情况下fsocksopen可以用curl替代之，后者更加安全，然后依然有部分程序，如aksimet反垃圾插件，discuz论坛都需要fsocksopen来支持，所以如果可能，我觉得还是打开fsocksopen函数比较人道。</p>
<p>因此，我想到了一个方案，不知道是否可行：</p>
<ol>
<li>写了一个脚本，定期扫描用户的文件，专门揪出那些有fsocksopen函数的文件，同时看看是否有被黑的标志，如果有，则标记为可疑文件；</li>
<li>用iptables监控流量，1分钟一次，如果发现outbound流量异常，则dump下当前的所有进程，以供后期人工排除查看；</li>
<li>将进程中的php文件 和可疑文件列表相对照，如果有吻合的文件，马上kill掉进程，同时将此文件属性标记为000，并且邮件通知；</li>
</ol>
<p>当然，上面的1，2，3将会用脚本自动完成 。<br />
这仅仅是一个想法，等到测试确实可能之后，homezz将会再次支持fsocksopen函数</p>
<p>发现一个问题：</p>
<ol>
<li>若用户的php脚本进行了简单的base64加密，判断难度增加；</li>
<li>若php脚本进行了其他方式的加密，则无法扫描；</li>
</ol>
<p>所以，目前还是有无法开启fsocksopen<br />
此种方案不太完美</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2011/3093_php-dos-solution.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>被黑脚本的特征列表（慢慢完善）</title>
		<link>http://www.storyday.com/html/y2011/3082_hack-scrpits.html</link>
		<comments>http://www.storyday.com/html/y2011/3082_hack-scrpits.html#comments</comments>
		<pubDate>Sat, 05 Nov 2011 11:55:42 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[互联网事]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[scripts]]></category>
		<category><![CDATA[虚拟主机]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=3082</guid>
		<description><![CDATA[做虚拟主机的，最怕的就是用户的脚本被黑。 因为黑客往往喜欢自己放脚本上去，从而影响整个服务器的运行。因此我这篇日志的目的就是列出常用的被黑特征，以供自己今后查找原因使用，当然，这些信息也会用于我自己编写的服务器脚本扫描代码中。 postocar.php  dedecms 被留下的脚本。脚本会建立大规模的socks连接，消耗光服务器资源； 目前只发现这个一个，本着有一个记录一个的目的，所以即使只有一个，也记录再次； 若读者朋友还知道其他的信息，欢迎留言添加，谢谢。]]></description>
			<content:encoded><![CDATA[<p>做虚拟主机的，最怕的就是用户的脚本被黑。</p>
<p>因为黑客往往喜欢自己放脚本上去，从而影响整个服务器的运行。因此我这篇日志的目的就是列出常用的被黑特征，以供自己今后查找原因使用，当然，这些信息也会用于我自己编写的服务器脚本扫描代码中。</p>
<ol>
<li>postocar.php  dedecms 被留下的脚本。脚本会建立大规模的socks连接，消耗光服务器资源；</li>
</ol>
<div>目前只发现这个一个，本着有一个记录一个的目的，所以即使只有一个，也记录再次；</div>
<div>若读者朋友还知道其他的信息，欢迎留言添加，谢谢。</div>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2011/3082_hack-scrpits.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>密码保护：屏蔽某个网站来源的用户的脚本</title>
		<link>http://www.storyday.com/html/y2011/3055_shield-the-source-of-a-website-useru002639s-script.html</link>
		<comments>http://www.storyday.com/html/y2011/3055_shield-the-source-of-a-website-useru002639s-script.html#comments</comments>
		<pubDate>Tue, 11 Oct 2011 09:42:13 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[互联网事]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=3055</guid>
		<description><![CDATA[无法提供摘要。这是一篇受保护的文章。]]></description>
			<content:encoded><![CDATA[<form action="http://www.storyday.com/wp-pass.php" method="post">
<p>这是一篇受密码保护的文章。您需要提供访问密码：</p>
<p><label for="pwbox-3055">密码：<br />
<input name="post_password" id="pwbox-3055" type="password" size="20" /></label><br />
<input type="submit" name="Submit" value="提交" /></p></form>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2011/3055_shield-the-source-of-a-website-useru002639s-script.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>简单介绍如何在网站集成支付宝或者paypal及时到帐交易</title>
		<link>http://www.storyday.com/html/y2010/2642_a-few-words-on-how-to-integrate-the-site-alipay-arrive-in-time-or-paypal-transactions.html</link>
		<comments>http://www.storyday.com/html/y2010/2642_a-few-words-on-how-to-integrate-the-site-alipay-arrive-in-time-or-paypal-transactions.html#comments</comments>
		<pubDate>Sun, 09 May 2010 05:57:30 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[互联网事]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2642</guid>
		<description><![CDATA[最近收到很多邮件，询问如何集成支付宝和paypal到网站中，而这些咨询的朋友又是比较熟悉php编程的，所以我不妨写一篇日志简单减少集成的流程： 支付宝请首先购买商家服务，否则没有API使用，同理paypal请升级为商家用户； 创建一个支付记录的数据表，表里面应该至少包含1. 交易ID 2.交易日期 3. 交易金额 4.此笔交易所有者的帐号，其他信息； 创建交易链接，创建链接包含交易金额，同时包含服务器通知链接*(后面有解释)，便于服务器将交易状态通知到该程序。 编写通知链接指向的那个文件，接收交易平台发过来的通知，如果确定交易成功，则返回一个“成功”的标志给服务器，以免服务器重复发送。同时将交易数据更新到第二步创建的数据表中，供今后使用； 至此，每个用户的当前余额就可以在交易记录中提取了，有了数据，后面如何扣款，那自然是很简单的事情了。 服务器通知链接*：一旦发起了交易，只要在支付宝或者是paypal创建成功，那么支付平台的服务器就会向你指定的这个链接发送通知。然后便可以根据发送过来的内容判断交易状态。当然，这个程序同时也要给交易平台一个应答，否则交易平台无法判断通知是否被接受到，如果无法判断通知被接受到，交易平台服务器会不断的发送通知，当然发送会有时间间隔的，这个时间间隔会不断的增大。 几点注意事项： 支付宝的通知链接是不能有任何get参数的，比如 http://homzz.com/ali_notify.php?userid=100 这样是永远不可能成功的，所以要判断交易与哪个用户相关，必须在第二步，将交易ID和交易所有者关联好，到时候根据支付宝的通知返回的交易ID来判断交易的所属； paypal没有get参数限制，然而paypal的交易ID是不可以预设的，因此，我们可以动态创建通知返回链接如http://homzz.com/ali_notify.php?userid=100，那么这笔交易产生之后，paypal就只会向这个指定的link发送通知； 接收到一个通知之后，请向paypal或者alipay返回成功标志，以免重复通知； 由于有时候程序故障，或者第三方支付平台也会故障，或者是网络故障，导致返回的“成功”标志没有被支付平台服务器识别，所以在第四步的时候，要考虑重复通知问题，也就是说，即使重复通知了，数据库也不要产生多次插入操作，防止凭空出现无用的交易。 就写到这里吧，这对做即使到帐交易程序的朋友应该有点帮助。]]></description>
			<content:encoded><![CDATA[<p><a href="https://www.alipay.com/"><img src="http://img.alipay.com/pics/sys/index/logo.gif" border="0" alt="支付宝，安全、简单、快捷的网上支付" align="left" /></a> 最近收到很多邮件，询问如何集成支付宝和paypal到网站中，而这些咨询的朋友又是比较熟悉php编程的，所以我不妨写一篇日志简单减少集成的流程：</p>
<ol>
<li>支付宝请首先购买商家服务，否则没有API使用，同理paypal请升级为商家用户；</li>
<li>创建一个支付记录的数据表，表里面应该至少包含1. 交易ID 2.交易日期 3. 交易金额 4.此笔交易所有者的帐号，其他信息；</li>
<li>创建交易链接，创建链接包含交易金额，同时包含服务器通知链接*(后面有解释)，便于服务器将交易状态通知到该程序。</li>
<li>编写通知链接指向的那个文件，接收交易平台发过来的通知，如果确定交易成功，则返回一个“成功”的标志给服务器，以免服务器重复发送。同时将交易数据更新到第二步创建的数据表中，供今后使用；</li>
<li>至此，每个用户的当前余额就可以在交易记录中提取了，有了数据，后面如何扣款，那自然是很简单的事情了。</li>
</ol>
<p><strong><img class="alignleft" style="border: 0px initial initial;" src="https://www.paypal.com/en_US/i/logo/paypal_logo.gif" alt="" />服务器通知链接*</strong>：一旦发起了交易，只要在支付宝或者是paypal创建成功，那么支付平台的服务器就会向你指定的这个链接发送通知。然后便可以根据发送过来的内容判断交易状态。当然，这个程序同时也要给交易平台一个应答，否则交易平台无法判断通知是否被接受到，如果无法判断通知被接受到，交易平台服务器会不断的发送通知，当然发送会有时间间隔的，这个时间间隔会不断的增大。</p>
<p><strong>几点注意事项：</strong></p>
<ol>
<li>支付宝的通知链接是不能有任何get参数的，比如 http://homzz.com/ali_notify.php?userid=100 这样是永远不可能成功的，所以要判断交易与哪个用户相关，必须在第二步，将交易ID和交易所有者关联好，到时候根据支付宝的通知返回的交易ID来判断交易的所属；</li>
<li>paypal没有get参数限制，然而paypal的交易ID是不可以预设的，因此，我们可以动态创建通知返回链接如http://homzz.com/ali_notify.php?userid=100，那么这笔交易产生之后，paypal就只会向这个指定的link发送通知；</li>
<li>接收到一个通知之后，请向paypal或者alipay返回成功标志，以免重复通知；</li>
<li>由于有时候程序故障，或者第三方支付平台也会故障，或者是网络故障，导致返回的“成功”标志没有被支付平台服务器识别，所以在第四步的时候，要考虑重复通知问题，也就是说，即使重复通知了，数据库也不要产生多次插入操作，防止凭空出现无用的交易。</li>
</ol>
<p>就写到这里吧，这对做即使到帐交易程序的朋友应该有点帮助。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2010/2642_a-few-words-on-how-to-integrate-the-site-alipay-arrive-in-time-or-paypal-transactions.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>解决最近刚刚出现的图片红叉问题</title>
		<link>http://www.storyday.com/html/y2009/2493_solve-the-emerging-picture-has-recently-been-the-issue-of-red-fork.html</link>
		<comments>http://www.storyday.com/html/y2009/2493_solve-the-emerging-picture-has-recently-been-the-issue-of-red-fork.html#comments</comments>
		<pubDate>Thu, 16 Jul 2009 15:13:49 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2493</guid>
		<description><![CDATA[由于本人的相册都很和谐，所以还是得想办法让用户能看见。 原理很简单，首先在国外的主机上加上一段代码，让国外的主机根据GET传递过去的url参数相片读取下来，缓存在自己服务器上，由于某个东西异常厉害，所以传递参数的时候还得要将某些单词给替代，才能传递，否则国外的主机连带撞死； 然后打开模板中的footer文件，添加一段js代码，此js代码的作用就是遍历该页所有图片，然后将其替代成http://xxx.com/readimg.php?这里是图片的地址，这样图片就可以正常显示了。js代码如下 $(“img “).each(function(i){//遍历本页所有的图片 var src = $(this).attr(“src”); if( src.indexOf(&#8216;ｇｇｐｈｔ&#8217;)!=-1 ){//如果图片来自某个地方，则替代之 $(this).attr(“src”,”http://0bad.com/readimg.php?src=”+src.replace(“ｇｇｐｈｔ”,”gouride”) );//则将图片地址改成转发的地址，记住ｇｇｐｈｔ替代掉，因为这个会触发墙 } }); 上面的全角字母请自行改成半角字母（请保证你主题引入了jquery ） 至于那个php文件，请到这里下载:pika 然后放置到你国外的空间。ache和cache下的所有文件夹属性请设置成0777 另外，请大家低调发表评论，不要带上关键字，被和谐怕了 另，效果请参见右上角的homezz图片。 php插件方式将会在明天发布，届时feed中的图片也会正常显示！ 此举仅仅是为了正常的blog能正常的显示图片，本人不敢造次！ 不太熟悉如何使用的朋友，请等待我的插件发布！]]></description>
			<content:encoded><![CDATA[<p>由于本人的相册都很和谐，所以还是得想办法让用户能看见。</p>
<p>原理很简单，首先在国外的主机上加上一段代码，让国外的主机根据GET传递过去的url参数相片读取下来，缓存在自己服务器上，由于某个东西异常厉害，所以传递参数的时候还得要将某些单词给替代，才能传递，否则国外的主机连带撞死；</p>
<p>然后打开模板中的footer文件，添加一段js代码，此js代码的作用就是遍历该页所有图片，然后将其替代成http://xxx.com/readimg.php?这里是图片的地址，这样图片就可以正常显示了。js代码如下</p>
<blockquote><p>$(“img “).each(function(i){//遍历本页所有的图片<br />
var src = $(this).attr(“src”);<br />
if( src.indexOf(&#8216;ｇｇｐｈｔ&#8217;)!=-1 ){//如果图片来自某个地方，则替代之<br />
$(this).attr(“src”,”http://0bad.com/readimg.php?src=”+src.replace(“ｇｇｐｈｔ”,”gouride”) );//则将图片地址改成转发的地址，记住ｇｇｐｈｔ替代掉，因为这个会触发墙<br />
}<br />
});</p></blockquote>
<p>上面的全角字母请自行改成半角字母（请保证你主题引入了jquery ）</p>
<p>至于那个php文件，<strong>请到这里下载:<a href="http://www.storyday.com/wp-content/uploads/2009/07/pika.zip">pika</a> </strong>然后放置到你国外的空间。ache和cache下的所有文件夹属性请设置成0777</p>
<p>另外，请大家低调发表评论，不要带上关键字，被和谐怕了</p>
<p>另，效果请参见右上角的homezz图片。</p>
<p>php插件方式将会在明天发布，届时feed中的图片也会正常显示！</p>
<p>此举仅仅是为了正常的blog能正常的显示图片，本人不敢造次！</p>
<p><strong>不太熟悉如何使用的朋友，请等待我的插件发布！</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2493_solve-the-emerging-picture-has-recently-been-the-issue-of-red-fork.html/feed</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>定期发送数据库备份到email的程序</title>
		<link>http://www.storyday.com/html/y2009/2470_regularly-sent-to-the-email-database-backup-procedures.html</link>
		<comments>http://www.storyday.com/html/y2009/2470_regularly-sent-to-the-email-database-backup-procedures.html#comments</comments>
		<pubDate>Wed, 08 Jul 2009 15:00:40 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[网站技术]]></category>
		<category><![CDATA[虚拟主机]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2470</guid>
		<description><![CDATA[cosbeta自己的每一个程序（如本站storyday.com,如homezz.com）都会有定期email备份，实现的原理很简单，那就是用php备份数据库，用crobjob定期（每天一次）执行这个程序将php的备份文件发送到我自己的email中。 程序下载地址：databasebackup。 程序的安装方法： 直接下载，解压缩，将目录上传到服务器上； 打开index.php按照注释修改最前面的配置信息； 设置 data 文件夹的属性为0777， 为了数据库不会直接被下载，请不要删除 .htaccess http://您的域名/databasebackup?code=随机代码 打开网页，看看有没有错误提示，若没有并且收到了数据库备份邮件，则表示程序运行成功 下面在cpanel中让该程序可以自动运行 登录cpanel 进入cronjobs 选择标准模式： 设置每天执行一次php程序 从此以后，您的数据库备份就会定期发送到您的邮箱。 提示：发件箱建议设置成gmail，我在国外虚拟主机上测试使用国内邮箱发送可能会失败。 程序下载地址：databasebackup。]]></description>
			<content:encoded><![CDATA[<p>cosbeta自己的每一个程序（如本站storyday.com,如homezz.com）都会有定期email备份，实现的原理很简单，那就是用php备份数据库，用crobjob定期（每天一次）执行这个程序将php的备份文件发送到我自己的email中。</p>
<p>程序下载地址：<a href="http://www.storyday.com/wp-content/uploads/2009/07/databasebackup.zip">databasebackup</a>。</p>
<p>程序的安装方法：</p>
<ol>
<li>直接下载，解压缩，将目录上传到服务器上；</li>
<li>打开index.php按照注释修改最前面的配置信息；</li>
<li>设置 data 文件夹的属性为0777， 为了数据库不会直接被下载，请不要删除 .htaccess</li>
<li>http://您的域名/databasebackup?code=随机代码 打开网页，看看有没有错误提示，若没有并且收到了数据库备份邮件，则表示程序运行成功</li>
</ol>
<p>下面在cpanel中让该程序可以自动运行</p>
<ol>
<li>登录cpanel</li>
<li>进入cronjobs<a href="http://www.storyday.com/wp-content/uploads/2009/07/22-53-16.jpg"><img class="alignnone size-full wp-image-2471" title="22-53-16" src="http://www.storyday.com/wp-content/uploads/2009/07/22-53-16.jpg" alt="22-53-16" width="107" height="60" /></a></li>
<li>选择标准模式：<img class="alignnone size-full wp-image-2472" title="22-53-22" src="http://www.storyday.com/wp-content/uploads/2009/07/22-53-22.jpg" alt="22-53-22" width="161" height="75" /></li>
<li>设置每天执行一次php程序<br />
<img class="alignnone size-full wp-image-2473" title="22-54-09" src="http://www.storyday.com/wp-content/uploads/2009/07/22-54-09.jpg" alt="22-54-09" width="476" height="275" /></li>
</ol>
<p>从此以后，您的数据库备份就会定期发送到您的邮箱。<br />
提示：发件箱建议设置成gmail，我在国外虚拟主机上测试使用国内邮箱发送可能会失败。</p>
<p>程序下载地址：<a href="../wp-content/uploads/2009/07/databasebackup.zip">databasebackup</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2470_regularly-sent-to-the-email-database-backup-procedures.html/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>mysql大数据转移解决方案</title>
		<link>http://www.storyday.com/html/y2009/2446_mysql-large-data-transfer-solution.html</link>
		<comments>http://www.storyday.com/html/y2009/2446_mysql-large-data-transfer-solution.html#comments</comments>
		<pubDate>Fri, 26 Jun 2009 10:14:36 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[网站技术]]></category>
		<category><![CDATA[虚拟主机]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.storyday.com/?p=2446</guid>
		<description><![CDATA[其实以前写过一次phpmyadmin无法导入大文件的解决方案，然而有些东西，若不点透，还是会有很大批的网友不明白怎么操作。所以下面我只告诉步骤，不再讲任何原理，事实证明，任何原理，懂的人没有必要看，不懂的人他们不会去看，即使原理很浅显。 首先在原来的phpmyadmin中分两步导出mysql数据库 请分两个步骤导出 第一步：导出数据库结构。数据库结构文件一般很小，几乎不可能超过2M，所以可以直接在另外一个phpmyadmin的上面直接恢复； 第二步：导出数据内容。这个文件若是太大，则可以采用cosbeta写的程序进行恢复（程序下载在本页最后，别急，请看完步骤再去下载）。 导出数据库结构 进入phpmyadmin，按照如下截图导出数据： 1.点击要导出的数据库名 2.点击导出按钮。 3.选择只导出结构 仔细看上面的选项，只需要把data那个勾去掉即可。只导出数据就恰恰相反，把structure勾去掉，data的勾选上 4.下载数据库结构 数据库结构的文件非常小，所以一般几秒钟即可搞定。 导出数据库内容 1.进入phpmyadmin，按照如下截图导出数据： 仔细看上面的选项，只需要把structure那个勾去掉即可。 2.下载数据库内容 因为您需要看了我这篇日志，所以，您的数据库文件应该不小，请耐心等待下载。 导入数据库结构 同样恢复数据库也分两步：1.恢复数据库结构；2.恢复数据库内容； 由于结构的备份文件相当小，所以恢复结构请直接在phpmyadmin中恢复，恢复过程参见下图： 选择数据库结构文件 导入数据库数据 本文的重点来了，你之所以看这篇日志，是因为您的数据太大，无法直接phpmyadmin，导入，所以我特意你写了一个脚本，直接在服务器上导入即可。 导入方法（请保证已经将数据库结构导入了新的数据库）： 下载这个文件 import，解压缩，放置在根目录中； 用记事本打开import.php,修改前面4行，您应该知道如何修改，就是把数据库密码和数据库用户名等等给填写正常； 解压缩刚才已经备份下来的数据库内容文件，重命名为 db.sql，上传到网站根目录； 打开你的网站 http://您的域名/import.php ,若设置正确的话，数据库将在数秒之内导入成功，即使10M的数据库也不会超时； 写得很幸苦，自认为已经很仔细了，若不会，不太愿意提供QQ或者gtalk及时聊天技术支持！]]></description>
			<content:encoded><![CDATA[<p>其实以前写过一次<a href="http://www.storyday.com/html/y2009/2337_phpmyadmin-can-not-import-large-sql-solutions.html">phpmyadmin无法导入大文件的解决方案</a>，然而有些东西，若不点透，还是会有很大批的网友不明白怎么操作。所以下面我只告诉步骤，不再讲任何原理，事实证明，任何原理，懂的人没有必要看，不懂的人他们不会去看，即使原理很浅显。</p>
<h4>首先在原来的phpmyadmin中<span style="color: #0000ff;">分两步</span>导出mysql数据库</h4>
<p>请分两个步骤导出</p>
<p><strong>第一步：导出数据库结构。</strong>数据库结构文件一般很小，几乎不可能超过2M，所以可以直接在另外一个phpmyadmin的上面直接恢复；<span id="more-2446"></span></p>
<p><strong>第二步：导出数据内容。</strong>这个文件若是太大，则可以采用cosbeta写的程序进行恢复（程序下载在本页最后，别急，请看完步骤再去下载）。</p>
<h4>导出数据库结构</h4>
<p>进入phpmyadmin，按照如下截图导出数据：</p>
<p>1.点击要导出的数据库名</p>
<p><img class="alignnone" title="wordpress数据库转移" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh3.gouride.com%2F_MUGaOIKDFIU%2FSkSQ_Vf5QII%2FAAAAAAAAEXU%2FNsT68j3ZL20%2Fs800%2Fsshot-2009-06-26-%5B16-33-12%5D.jpg" alt="" width="210" height="201" /></p>
<p>2.点击导出按钮。</p>
<p><img class="alignnone" title="大数据库的转移" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh5.gouride.com%2F_MUGaOIKDFIU%2FSkSSgudKvzI%2FAAAAAAAAEYE%2FFJMmjIMW3Zg%2Fs800%2Fsshot-2009-06-26-%5B17-17-38%5D.jpg" alt="" width="348" height="89" /></p>
<p>3.选择<strong>只导出结构</strong></p>
<p><img class="alignnone" title="大数据库的转移" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh6.gouride.com%2F_MUGaOIKDFIU%2FSkSQ_n_DwRI%2FAAAAAAAAEXY%2FkJCv8lyS67Q%2Fs800%2Fsshot-2009-06-26-%5B16-34-45%5D.jpg" alt="" width="294" height="338" /></p>
<p>仔细看上面的选项，<strong>只需要把data那个勾去掉即可</strong>。只导出数据就恰恰相反，把structure勾去掉，data的勾选上</p>
<p>4.下载数据库结构</p>
<p><img class="alignnone" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh3.gouride.com%2F_MUGaOIKDFIU%2FSkSQ_9VPzJI%2FAAAAAAAAEXc%2FpGdauZ8owyw%2Fs800%2Fsshot-2009-06-26-%5B16-34-56%5D.jpg" alt="" width="434" height="166" /></p>
<p>数据库结构的文件非常小，所以一般几秒钟即可搞定。</p>
<h4>导出数据库内容</h4>
<p>1.进入phpmyadmin，按照如下截图导出数据：</p>
<p><img class="alignnone" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh3.gouride.com%2F_MUGaOIKDFIU%2FSkSRAIVGncI%2FAAAAAAAAEXg%2FxVv0Y_k1zEw%2Fs800%2Fsshot-2009-06-26-%5B16-35-09%5D.jpg" alt="" width="394" height="419" /></p>
<p>仔细看上面的选项，<strong>只需要把</strong>structure<strong>那个勾去掉即可</strong>。</p>
<p>2.下载数据库内容</p>
<p><img src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh3.gouride.com%2F_MUGaOIKDFIU%2FSkSQ_9VPzJI%2FAAAAAAAAEXc%2FpGdauZ8owyw%2Fs800%2Fsshot-2009-06-26-%5B16-34-56%5D.jpg" alt="" width="434" height="166" /></p>
<p>因为您需要看了我这篇日志，所以，您的数据库文件应该不小，请耐心等待下载。</p>
<h4>导入数据库<span style="color: #0000ff;">结构</span></h4>
<p>同样恢复数据库也分两步：1.恢复数据库结构；2.恢复数据库内容；</p>
<p>由于结构的备份文件相当小，所以恢复结构请直接在phpmyadmin中恢复，恢复过程参见下图：</p>
<p><img class="alignnone" title="恢复数据库" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh5.gouride.com%2F_MUGaOIKDFIU%2FSkSZXrdCPsI%2FAAAAAAAAEY8%2FRv1EoTKiOjM%2Fs800%2Fsshot-2009-06-26-%5B17-47-53%5D.jpg" alt="" width="372" height="83" /></p>
<p>选择数<strong>据库结构文件</strong></p>
<p><img class="alignnone" title="mysq导入" src="http://0bad.com/readimg.php?src=http%3A%2F%2Flh6.gouride.com%2F_MUGaOIKDFIU%2FSkSZXxn-FEI%2FAAAAAAAAEZA%2FnF89bO60Sts%2Fs800%2Fsshot-2009-06-26-%5B17-48-00%5D.jpg" alt="" width="393" height="123" /></p>
<h4>导入数据库<span style="color: #0000ff;">数据</span></h4>
<p>本文的重点来了，你之所以看这篇日志，是因为您的数据太大，无法直接phpmyadmin，导入，所以我特意你写了一个脚本，直接在服务器上导入即可。</p>
<p>导入方法（请保证已经将数据库结构导入了新的数据库）：</p>
<ol>
<li>下载这个文件 <a href="/wp-content/uploads/2009/05/import.zip">import</a>，解压缩，放置在根目录中；</li>
<li>用记事本打开import.php,修改前面4行，您应该知道如何修改，就是把数据库密码和数据库用户名等等给填写正常；</li>
<li>解压缩刚才已经备份下来的<strong>数据库内容</strong>文件，重命名为 db.sql，上传到网站根目录；</li>
<li>打开你的网站 http://您的域名/import.php ,若设置正确的话，数据库将在数秒之内导入成功，即使10M的数据库也不会超时；</li>
</ol>
<p>写得很幸苦，自认为已经很仔细了，若不会，不太愿意提供QQ或者gtalk及时聊天技术支持！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2446_mysql-large-data-transfer-solution.html/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>一个判断网站是否和谐的思路</title>
		<link>http://www.storyday.com/html/y2009/2363_site-to-determine-whether-a-harmonious-ideas.html</link>
		<comments>http://www.storyday.com/html/y2009/2363_site-to-determine-whether-a-harmonious-ideas.html#comments</comments>
		<pubDate>Tue, 19 May 2009 09:31:56 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[网站技术]]></category>
		<category><![CDATA[虚拟主机]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.storyday.com/html/y2009/2363_%e4%b8%80%e4%b8%aa%e5%88%a4%e6%96%ad%e7%bd%91%e7%ab%99%e6%98%af%e5%90%a6%e5%92%8c%e8%b0%90%e7%9a%84%e6%80%9d%e8%b7%af.html</guid>
		<description><![CDATA[万里长城永不到，互联网上的长城一直是网友心中的痛，它将我们保护得严严实实，密不透风，以至于墙外的好东西都无法让我们欣赏到，一旦有东西探头进来，必杀之。如今的墙已经变得不能再敏感了，就如同有过敏性鼻炎的人一样，一旦有少量的过敏原，喷嚏就会不断。 cosbeta对墙异常害怕，因为它的一个小动作就能让我忙上几十天。所以cosbeta自己写了一个小程序，来判断homezz 下面的站点是否有少量出格的语言。具体思路如下： 利用api获取homezz下面主机群所有绑定的域名，包括子域名； 每天定时用curl模拟浏览器，google和百度搜索 site:xxx.com； 截取前面搜索的几个url链接（因为每天都要执行这个动作，所以cosbeta只截取了前面10个链接）； 利用php curl逐一访问这10个链接，访问之后再访问三次，比较三次的结果，若发现某个网址3次结果数据length差距明显，变分析是不是访问不拒绝； 若是访问拒绝，从api中获取该用户的cpanel帐户，suspend 之; 当然，上面的程序必须在国内的服务器上运行，或者在你本机上运行。 前天运行此程序，suspend了3个帐户，不过考虑到主要靠自律，所以cosbeta暂时取消了这个程序。 目前正在想办法进一步完善这个程序！]]></description>
			<content:encoded><![CDATA[<p>万里长城永不到，互联网上的长城一直是网友心中的痛，它将我们保护得严严实实，密不透风，以至于墙外的好东西都无法让我们欣赏到，一旦有东西探头进来，必杀之。如今的墙已经变得不能再敏感了，就如同有过敏性鼻炎的人一样，一旦有少量的过敏原，喷嚏就会不断。</p>
<p>cosbeta对墙异常害怕，因为它的一个小动作就能让我忙上几十天。所以cosbeta自己写了一个小程序，来判断<a href="http://homezz.com" target="_blank">homezz</a> 下面的站点是否有少量出格的语言。具体思路如下：</p>
<ol>
<li>利用api获取homezz下面主机群所有绑定的域名，包括子域名；</li>
<li>每天定时用curl模拟浏览器，google和百度搜索 site:xxx.com；</li>
<li>截取前面搜索的几个url链接（因为每天都要执行这个动作，所以cosbeta只截取了前面10个链接）；</li>
<li>利用php curl逐一访问这10个链接，访问之后再访问三次，比较三次的结果，若发现某个网址3次结果数据length差距明显，变分析是不是访问不拒绝；</li>
<li>若是访问拒绝，从api中获取该用户的cpanel帐户，suspend 之;</li>
</ol>
<p>当然，上面的程序必须在国内的服务器上运行，或者在你本机上运行。</p>
<p>前天运行此程序，suspend了3个帐户，不过考虑到主要靠自律，所以cosbeta暂时取消了这个程序。</p>
<p>目前正在想办法进一步完善这个程序！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2363_site-to-determine-whether-a-harmonious-ideas.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>phpmyadmin无法导入大的SQL解决方案</title>
		<link>http://www.storyday.com/html/y2009/2337_phpmyadmin-can-not-import-large-sql-solutions.html</link>
		<comments>http://www.storyday.com/html/y2009/2337_phpmyadmin-can-not-import-large-sql-solutions.html#comments</comments>
		<pubDate>Sun, 10 May 2009 03:16:20 +0000</pubDate>
		<dc:creator>江东</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网站技术]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.storyday.com/html/y2009/2337_phpmyadmin%e6%97%a0%e6%b3%95%e5%af%bc%e5%85%a5%e5%a4%a7%e7%9a%84sql%e8%a7%a3%e5%86%b3%e6%96%b9%e6%a1%88.html</guid>
		<description><![CDATA[其实导入SQL的最快的方法还是直接登录到服务器上，直接命令行导入，没有开通SSH的服务器可以通过其他服务器中转导入，但是这些方法对于不熟悉linux命令的朋友都显得比较麻烦。所以，我昨天晚上就花了一点时间，写了一个简陋的php文件，用于导入大的sql到新的mysql数据库中。 内容如下 define('DB_NAME', 'wordpress'); define('DB_USER', 'wordpress'); define('DB_PASSWORD', 'wordpress'); define('DB_HOST', 'localhost'); /*直接copy您wordpress数据库设置部分即可*/ $mysql = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die("mysql connect fail, wrong password"); mysql_select_db(DB_NAME)or die("select DB fail"); mysql_query("set names utf8"); $fp = fopen("db.sql","r") or die('can not open file'); while( $s = fgets( $fp,100000 ) ){ $m .= $s; } $sql_content = explode(";\n",$m); $i = 0; $max = count($sql_content) [...]]]></description>
			<content:encoded><![CDATA[<p>其实导入SQL的最快的方法还是直接登录到服务器上，直接命令行导入，没有开通SSH的服务器可以通过其他服务器中转导入，但是这些方法对于不熟悉linux命令的朋友都显得比较麻烦。所以，我昨天晚上就花了一点时间，写了一个简陋的php文件，用于导入大的sql到新的mysql数据库中。</p>
<p>内容如下<code><br />
define('DB_NAME', 'wordpress');<br />
define('DB_USER', 'wordpress');<br />
define('DB_PASSWORD', 'wordpress');<br />
define('DB_HOST', 'localhost');<br />
/*直接copy您wordpress数据库设置部分即可*/<br />
$mysql = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD) or die("mysql connect fail, wrong password");<br />
mysql_select_db(DB_NAME)or die("select DB fail");<br />
mysql_query("set names utf8");<br />
$fp = fopen("db.sql","r") or die('can not open file');<br />
while( $s = fgets( $fp,100000 ) ){<br />
$m .= $s;<br />
}<br />
$sql_content = explode(";\n",$m);<br />
$i = 0;<br />
$max = count($sql_content) ;<br />
while( $i &lt; $max ){<br />
mysql_query( $sql_content [$i] );<br />
if( mysql_error()) echo mysql_error()."&lt;br /&gt;";<br />
else{<br />
$n ++;<br />
}<br />
$i ++;<br />
}<br />
echo "&lt;br /&gt;mysql queries:".$n;<br />
fclose($fp);</code></p>
<p>导入就很简单了，将需要导入的sql文件命名为db.sql，上传到网站根目录，将上面的代码保存为import.php也上传到根目录，然后运行import.php，即可完成数据库的导入。<br />
当然，您也可以直接下载这个文件：<a href='http://www.storyday.com/wp-content/uploads/2009/05/import.zip'>import</a>。</p>
<p>注意：导入之后，请一定要删除或者重命名这个import.php文件</p>
]]></content:encoded>
			<wfw:commentRss>http://www.storyday.com/html/y2009/2337_phpmyadmin-can-not-import-large-sql-solutions.html/feed</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

