<?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>Kangzj &#187; preminder</title>
	<atom:link href="http://kangzj.net/tag/preminder/feed/" rel="self" type="application/rss+xml" />
	<link>http://kangzj.net</link>
	<description>记录技术和生活~</description>
	<lastBuildDate>Mon, 07 May 2012 01:03:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Preminder(PR更新提醒服务)小升级</title>
		<link>http://kangzj.net/a-preminder-update/</link>
		<comments>http://kangzj.net/a-preminder-update/#comments</comments>
		<pubDate>Wed, 07 Oct 2009 13:17:07 +0000</pubDate>
		<dc:creator>kangzj</dc:creator>
				<category><![CDATA[独立博客]]></category>
		<category><![CDATA[pagerank]]></category>
		<category><![CDATA[pr]]></category>
		<category><![CDATA[preminder]]></category>
		<category><![CDATA[PR更新]]></category>
		<category><![CDATA[升级]]></category>

		<guid isPermaLink="false">http://kangzj.net/?p=1051</guid>
		<description><![CDATA[把Preminder程序完善了下，加了一段验证网络是否通畅的程序。如果网络通畅就检测PR，否则就等几分钟再进行下一次检。]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong><span style="color: #993300;">注意：PR尚未更新，本文是介绍我的“Preminder&#8211;PR更新提醒服务<strong><span style="color: #993300;">”</span></strong>程序升级而已。 </span></strong></p></blockquote>
<p>由于我的服务器放在学校机房，网络经常会短时的抽风(学校网络中心技术不太行)，<a href="http://apps.kangzj.net/preminder/" target="_blank">Preminder</a>发出了几次PR更新误报（连接不到Google，于是得到的PR为0，于是发邮件通知PR变为0；等到网络恢复之后，<a href="http://apps.kangzj.net/preminder/" target="_blank">Preminder</a>得到正确的PR便又会发出一封通知邮件）。在这里给收到误报邮件的同学道个歉，对不起啦。</p>
<p>光说对不起没用，要解决才行，Kangzj想了想，把程序完善了下，加了一段验证网络是否通畅的程序。如果网络通畅就检测PR，否则就等几分钟再进行下一次检测…总共进行6次。<br />
代码如下：<br />
<span id="more-1051"></span></p>
<pre lang="php">//以www.google.com为标准，如果它的PR为0，说明网络有问题
//等待200秒，再次检测；总共检测6次
for($j=0;$&lt;6;$j++){
        $ggpr=intval(pagerank('www.google.com'));
        if($ggpr==0){
                sleep(200);
        }else{
                break;
        }
}
//如果经过6次检测之后，网络还没有通畅，那么终止程序
//等到下次cron执行再说
if($j==6)exit;</pre>
<p>这样的话，就不会因为网络问题而乱发邮件啦~~吼吼~~ 还没有用上的同学赶快来注册下吧：<br />
<a href="http://apps.kangzj.net/preminder/">http://apps.kangzj.net/preminder/</a></p>
<p style='text-align:left'>&copy; 2009, <a href='http://kangzj.net'>kangzj</a>. 版权所有.  </p>
<hr />
<p><small>© kangzj for <a href="http://kangzj.net">Kangzj</a>, 2009. |
<a href="http://kangzj.net/a-preminder-update/">http://kangzj.net/a-preminder-update/</a> |
<a href="http://kangzj.net/a-preminder-update/#comments">37 条评论</a> |
Add to
<a href="http://del.icio.us/post?url=http://kangzj.net/a-preminder-update/&title=Preminder(PR更新提醒服务)小升级">del.icio.us</a>
<br/>
Post tags: <a href="http://kangzj.net/tag/pagerank/" rel="tag">pagerank</a>, <a href="http://kangzj.net/tag/pr/" rel="tag">pr</a>, <a href="http://kangzj.net/tag/preminder/" rel="tag">preminder</a>, <a href="http://kangzj.net/tag/pr%e6%9b%b4%e6%96%b0/" rel="tag">PR更新</a>, <a href="http://kangzj.net/tag/%e5%8d%87%e7%ba%a7/" rel="tag">升级</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://kangzj.net/a-preminder-update/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>Preminder Beta后台程序源码</title>
		<link>http://kangzj.net/preminder-beta-source-code/</link>
		<comments>http://kangzj.net/preminder-beta-source-code/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 08:06:54 +0000</pubDate>
		<dc:creator>kangzj</dc:creator>
				<category><![CDATA[网站制作]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[pagerank]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php-cli]]></category>
		<category><![CDATA[php-email]]></category>
		<category><![CDATA[pr]]></category>
		<category><![CDATA[preminder]]></category>

		<guid isPermaLink="false">http://kangzj.net/?p=929</guid>
		<description><![CDATA[Preminder Beta后台程序源码，加了些注释，大家可以看一下。这里面最有意思就是HashURL时的$SEED，其实获取PR是不符合Google的服务条款的，很汗的吧]]></description>
			<content:encoded><![CDATA[<p><a href="http://apps.kangzj.net/preminder/">Preminder</a> Beta后台程序源码，用PHP-CLI写的（<a href="http://kangzj.net/php-cli/">什么是PHP-CLI?</a>）加了些注释，大家可以看一下。最有意思就是HashURL时的$SEED，其实获取PR是不符合Google的服务条款的，很汗的吧……</p>
<p>写好脚本之后，在/etc/crontab里加入一条每小时执行的计划，就可以啦，<a href="http://apps.kangzj.net/preminder/list.php">在这里可以看到PR检测日志</a>！</p>
<blockquote><p>27 *    * * *   root    /usr/bin/php -f /home/kangzj/kang.php</p></blockquote>
<p><span id="more-929"></span><br />
数据库的结构为：</p>
<blockquote><p>&#8211;<br />
&#8211; 表的结构 `logs`<br />
&#8211;</p>
<p>CREATE TABLE `logs` (<br />
  `ID` int(11) NOT NULL auto_increment,<br />
  `info` varchar(150) NOT NULL,<br />
  `utime` bigint(11) NOT NULL,<br />
  PRIMARY KEY  (`ID`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;</p>
<p>&#8211;<br />
&#8211; 表的结构 `users`<br />
&#8211;</p>
<p>CREATE TABLE `users` (<br />
  `ID` int(11) NOT NULL auto_increment,<br />
  `email` varchar(50) NOT NULL,<br />
  `domain` varchar(100) NOT NULL,<br />
  `pr` tinyint(2) NOT NULL,<br />
  `lastcheck` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,<br />
  PRIMARY KEY  (`ID`)<br />
) ENGINE=InnoDB DEFAULT CHARSET=utf8;</p></blockquote>
<pre lang="php">
< ?
//随机取5个PR低的域名进行检测，如果有PR变化则继续检测所有域名，否则退出程序
//测试集的大小
$testSetSize = 5;

//connect to mysql
$conn  = mysql_connect('localhost','preminder','111') or die('error');
mysql_select_db('preminder');

$result = mysql_query("select email, domain, pr from users where pr<=3  order by RAND() limit $testSetSize");

//计数
$i=0;
while($row = mysql_fetch_array($result))
{
	$nowpr = intval(pagerank($row['domain']));
	// $nowpr.' '.$row['pr'];
	if($nowpr != $row['pr']){
		break;
	}
	$i++;
	sleep(1);
}

if($i == $testSetSize){
             //写日志
	mysql_query("insert into logs (utime, info) values ('".time()."','No pr updates detected!')");
            //没有更新退出程序
	exit;//no updates
}

//and there's pr update
$up=0;
$down=0;
$same=0;
$logs="domain\tfrom\tto\n";
$result = mysql_query('select email, domain, pr from users');

while($row = mysql_fetch_array($result))
{
        $nowpr = intval(pagerank($row['domain']));
	$email = $row['email'];
	$domain = $row['domain'];
	$pr = $row['pr'];
	if($nowpr != $pr)
	        mysql_query("update users set pr='$nowpr' where email='$email' and domain='$domain'");
 	$subject = '您的'.$domain.'的PR由'.$pr.'更新为'.$nowpr;
	$message = '亲爱的'.$email.',

&nbsp;&nbsp;您的域名'.$domain.'的pr由'.$pr.'更新为'.$nowpr;
	$headers = $headers = "MIME-Version: 1.0\r\nContent-type: text/html; \r\n    charset=\"utf-8\"\r\n".'From: noreply@kangzj.net' . "\r\n" .
	    'Reply-To: kangzj@kangzj.net' . "\r\n" .
	    'X-Mailer: PHP/' . phpversion();
	if($nowpr>$pr)
	{
		$up++;
		$message.=',恭喜！';
	}elseif($nowpr< $pr)
	{
		$down++;
		$message.=',降低了...';
	}else
	{
		$same++;
		$message.=',没有变化哦。';
	}
	$message.='

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://kangzj.net">http://kangzj.net</a>敬上

';
	mail($email, $subject, $message, $headers);
	$logs .= "$domain\t$pr\t$nowpr\t\n";

	sleep(1);
}
$fname = './'.date("Y-m-d-H-i-s", time()).'.log';
//写文件更新日志，含所有域名PR变化情况
file_put_contents($fname, $logs);

//更新日志
mysql_query("insert into logs (info, utime) values ('$up domains PR rose, $down domains PR dropped, $same domains PR remained the same.','" .time()."')");

//检测PR函数
/*
*encode the url
*/
function HashURL($url)
{$SEED = "Mining PageRank is AGAINST GOOGLE'S TERMS OF SERVICE. Yes, I'm talking to you, scammer.";
    $Result = 0x01020345;
    for ($i=0; $i<strlen ($url); $i++)
    {
        $Result ^= ord($SEED{$i%87}) ^ ord($url{$i});
        $Result = (($Result >> 23) &#038; 0x1FF) | $Result < < 9;
    }
    return sprintf("8%x", $Result);
}

/*
*get pagerank
*/
function pagerank($domain)
{
	$StartURL = "http://www.google.com/search?client=navclient-auto&#038;googleip=0;973&#038;ie=UTF-8&#038;oe=UTF-8&#038;features=Rank&#038;q=info:";

 	$GoogleURL = $StartURL.$domain. '&#038;ch='.HashURL($domain);

	$fcontents = file_get_contents("$GoogleURL");

	$pagerank = substr($fcontents,9);
	return intval($pagerank);
}

?></strlen></pre>
<p style='text-align:left'>&copy; 2009, <a href='http://kangzj.net'>kangzj</a>. 版权所有.  </p>
<hr />
<p><small>© kangzj for <a href="http://kangzj.net">Kangzj</a>, 2009. |
<a href="http://kangzj.net/preminder-beta-source-code/">http://kangzj.net/preminder-beta-source-code/</a> |
<a href="http://kangzj.net/preminder-beta-source-code/#comments">20 条评论</a> |
Add to
<a href="http://del.icio.us/post?url=http://kangzj.net/preminder-beta-source-code/&title=Preminder Beta后台程序源码">del.icio.us</a>
<br/>
Post tags: <a href="http://kangzj.net/tag/google/" rel="tag">google</a>, <a href="http://kangzj.net/tag/pagerank/" rel="tag">pagerank</a>, <a href="http://kangzj.net/tag/php/" rel="tag">php</a>, <a href="http://kangzj.net/tag/php-cli/" rel="tag">php-cli</a>, <a href="http://kangzj.net/tag/php-email/" rel="tag">php-email</a>, <a href="http://kangzj.net/tag/pr/" rel="tag">pr</a>, <a href="http://kangzj.net/tag/preminder/" rel="tag">preminder</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://kangzj.net/preminder-beta-source-code/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>php-cli简介&#8212;&#8212;不会Shell语言，一样用Shell！</title>
		<link>http://kangzj.net/php-cli/</link>
		<comments>http://kangzj.net/php-cli/#comments</comments>
		<pubDate>Tue, 08 Sep 2009 15:16:11 +0000</pubDate>
		<dc:creator>kangzj</dc:creator>
				<category><![CDATA[服务器OS]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[php-cli]]></category>
		<category><![CDATA[preminder]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[命令行]]></category>

		<guid isPermaLink="false">http://kangzj.net/?p=916</guid>
		<description><![CDATA[php可以用来做动态网页，当初php就是为做动态网页而开发的语言，但是理论上php可以用来做任何的程序，甚至是桌面程序，而php-cli是php在命令行运行的支持环境，也就是我们说的可以用来写Shell的环境支持]]></description>
			<content:encoded><![CDATA[<h3>1.基础知识</h3>
<h4>1.1 什么是Shell编程?</h4>
<p>在 Unix 中，shell 可不是简单的命令解释器（典型的有 Windows 中的 DOS ），而是一个全功能的编程环境。Shell 是操作系统的一部分，用来与用户打交道，并且可以用来协调各个命令【1】。用Shell编程可以灵活地解决大量重复任务，十分方便。但是，Shell的语法十分怪异（个人意见），不容易记，如果现在熟悉的语言可以用来写shell那就好了——比如php——就可以快速开发Shell程序了（比如我的<a href="http://apps.kangzj.net/preminder/">Preminder</a>的后台程序），于是便有了这篇文章，本文以Linux为例说明php-cli的用法，其它平台的版本类似。</p>
<h4>1.2 什么是php-cli?</h4>
<p>刚才说到，我们可以用php来开发Shell程序。有的同学可能会问啦：“php不是用来做网页的么？-_-”。是的，php可以用来做动态网页，并且当初php就是为做动态网页而开发的语言，但是理论上php可以用来做任何的程序，甚至是桌面程序，而<strong>php-cli</strong>是php在命令行运行的支持环境，也就是我们说的可以用来写Shell的环境支持。</p>
<blockquote><p><strong>php-cli</strong>是php Command Line Interface的简称，如同它名字的意思，就是php在命令行运行的接口，区别于在Web服务器上运行的php环境（php-cgi, isapi等）【2】。</p></blockquote>
<p>也就是说，php不单可以写前台网页，它还可以用来写后台的程序。</p>
<p><span id="more-916"></span></p>
<h3>2. 执行php-cli脚本</h3>
<h4>2.1 php-cli的语法</h4>
<p>当然是跟php一模一样啦，因为它就是php嘛！只不过一些默认的参数与php-cgi不同，比如运行时间：php-cli默认运行时间是无穷，而网页php默认设置是30s。</p>
<h4>2.2 执行php-cli脚本</h4>
<h5>2.2.1. 直接在终端执行php</h5>
<pre lang="shell">kangzj@localhost# php -r 'print_r(get_defined_constants());'</pre>
<h5>2.2.2. 运行php-cli脚本文件</h5>
<pre lang="shell">kangzj@localhost# php my_script.php

kangzj@localhost# php -f my_script.php</pre>
<p>上而说的php文件就是一般的php文件没有什么不同。还有一种方式，就是在文件中指令解释器，就可以直接在终端以”./test.php执行脚本了”，test.php就像下面这样：</p>
<pre lang="php">#!/usr/bin/php -q
&lt;?php
  echo "Hello world of PHP CLI!";
?&gt;</pre>
<p>补充：php的Shell程序并不一定以php为扩展名，可以以任意扩展名，甚至不要扩展名，只是为了清楚，我才用的php扩展名。</p>
<h5>2.2.3. 用Cron执行php-cli脚本</h5>
<p><a href="http://kangzj.net/linux-cron/">cron是一个linux下的定时执行工具，可以在无需人工干预的情况下运行作业</a>，周期性作业，比如备份数据，<a href="http://apps.kangzj.net/preminder/">Preminder</a>定期查询PR等等，添加的方法：打开/etc/crontab，添加：</p>
<pre lang="shell">0 13 * * * /usr/bin/php -f /home/phpscripts/phpcli.php</pre>
<h3>4. 结语</h3>
<p>如果你会php的话，那么你也会了一种Shell编程语言！</p>
<p>如果你不会php，你去学php，就相当于一下子学会动态网页和Shell两种语言！并且你甚至可以用php来写具有图形界面的应用程序，Dnspod的动态域名客户端中就有一种是用php开发的。</p>
<p>php的易学是出名的，如果你还不会，那是在犹豫什么呢？</p>
<p>另外，再宣传一下我的”<a href="http://apps.kangzj.net/preminder/">Preminder</a>”——PR更新Email提醒服务~~</p>
<h3>5. 参考文献</h3>
<ol>
<li>Linux Shell简介 ： <a title="http://www.linuxsir.org/main/?q=node/135" href="http://www.linuxsir.org/main/?q=node/135">http://www.linuxsir.org/main/?q=node/135</a></li>
<li>PHP Command Line Interface : Mystic Unleashed ：<a title="http://www.php-cli.com/" href="http://www.php-cli.com/">http://www.php-cli.com/</a></li>
<li>ch 4.2， php manual ： <a href="http://www.php.net">http://www.php.net</a></li>
</ol>
<p>PS：Shell命令还是要知道一些的，否则有些功能不太好实现。</p>
<p style='text-align:left'>&copy; 2009, <a href='http://kangzj.net'>kangzj</a>. 版权所有.  </p>
<hr />
<p><small>© kangzj for <a href="http://kangzj.net">Kangzj</a>, 2009. |
<a href="http://kangzj.net/php-cli/">http://kangzj.net/php-cli/</a> |
<a href="http://kangzj.net/php-cli/#comments">11 条评论</a> |
Add to
<a href="http://del.icio.us/post?url=http://kangzj.net/php-cli/&title=php-cli简介&mdash;&mdash;不会Shell语言，一样用Shell！">del.icio.us</a>
<br/>
Post tags: <a href="http://kangzj.net/tag/cron/" rel="tag">cron</a>, <a href="http://kangzj.net/tag/linux/" rel="tag">linux</a>, <a href="http://kangzj.net/tag/php/" rel="tag">php</a>, <a href="http://kangzj.net/tag/php-cli/" rel="tag">php-cli</a>, <a href="http://kangzj.net/tag/preminder/" rel="tag">preminder</a>, <a href="http://kangzj.net/tag/shell/" rel="tag">shell</a>, <a href="http://kangzj.net/tag/%e5%91%bd%e4%bb%a4%e8%a1%8c/" rel="tag">命令行</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://kangzj.net/php-cli/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>本站推出PR更新Email通知服务&#8211;”Preminder”！</title>
		<link>http://kangzj.net/preminder-is-serving-now/</link>
		<comments>http://kangzj.net/preminder-is-serving-now/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 13:35:37 +0000</pubDate>
		<dc:creator>kangzj</dc:creator>
				<category><![CDATA[网站制作]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[pagerank]]></category>
		<category><![CDATA[preminder]]></category>

		<guid isPermaLink="false">http://kangzj.net/?p=909</guid>
		<description><![CDATA[仅仅提供PR查询还是不方便，于是能折腾的kangzj，又做出来一个东西“Preminder”，可以在PR更新的时候第一时间通知你！]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://apps.kangzj.net/preminder/"><img class="aligncenter" title="Preminder" src="http://apps.kangzj.net/preminder/preminder-logo.gif" alt="" /></a></p>
<blockquote><p>仅仅提供<a href="http://kangzj.net/pagerank/">PR查询</a>还是不方便，能折腾的kangzj于是又做出来一个东西“<strong><a href="http://apps.kangzj.net/preminder/" target="_self">Preminder</a></strong>”————PR更新邮件提醒服务！</p></blockquote>
<p><span id="more-909"></span>经过一晚上的折腾，把Email提示PR更新的功能给做好了。在PR发生更新的时候，你会在第一时间收到本站发送的电子邮件，不用再整天上PR查询网站去看，或者安装烦人Google的工具条啦！</p>
<p>在PR发生更新的时候，你会收到像下面这样的邮件：</p>
<p><a href="http://kangzj.net/wp-content/uploads/images/200909/PREmail_12F96/prupdate.jpg"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="pr-update" src="http://kangzj.net/wp-content/uploads/images/200909/PREmail_12F96/prupdate_thumb.jpg" border="0" alt="pr-update" width="260" height="158" /></a></p>
<p>我承诺，绝对不会把大家的Email提供给任何人或者用于发送其它信息，大家放心使用，还在犹豫什么呢，<strong>赶快来登记你的Email和域名吧</strong>！！</p>
<p>我把这项服务命名为<strong>Preminder</strong>，意思为pagerank reminder，即“PR更新提示”，大家多支持啊:-)</p>
<p><a href="http://apps.kangzj.net/preminder/"><img style="border-bottom: 0px; border-left: 0px; display: block; float: none; margin-left: auto; border-top: 0px; margin-right: auto; border-right: 0px" title="pr-interface" src="http://kangzj.net/wp-content/uploads/images/200909/PREmail_12F96/printerface.jpg" border="0" alt="pr-interface" width="600" height="138" /></a></p>
<p align="center">地址： <a href="http://apps.kangzj.net/preminder/">http://apps.kangzj.net/preminder/</a></p>
<p>工作原理及源码稍后提供给大家:-)</p>
<p style='text-align:left'>&copy; 2009, <a href='http://kangzj.net'>kangzj</a>. 版权所有.  </p>
<hr />
<p><small>© kangzj for <a href="http://kangzj.net">Kangzj</a>, 2009. |
<a href="http://kangzj.net/preminder-is-serving-now/">http://kangzj.net/preminder-is-serving-now/</a> |
<a href="http://kangzj.net/preminder-is-serving-now/#comments">108 条评论</a> |
Add to
<a href="http://del.icio.us/post?url=http://kangzj.net/preminder-is-serving-now/&title=本站推出PR更新Email通知服务&#8211;”Preminder”！">del.icio.us</a>
<br/>
Post tags: <a href="http://kangzj.net/tag/google/" rel="tag">google</a>, <a href="http://kangzj.net/tag/pagerank/" rel="tag">pagerank</a>, <a href="http://kangzj.net/tag/preminder/" rel="tag">preminder</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://kangzj.net/preminder-is-serving-now/feed/</wfw:commentRss>
		<slash:comments>108</slash:comments>
		</item>
	</channel>
</rss>

