用php进行svn更新代码,支持断点续传0+

42,505 views / 2009.11.21 / 5:05 下午

本空间用的虚拟主机特别恶心,ftp不好用,又不支持ssh, php的安全级别又设置的比较高,导致杜工每次更新代码都特别费劲。琢磨了半天,想出了一个办法,就是直接从svn下载代码到服务器,这样就可以更新wordpress了。

<?php
@set_time_limit(0);
// $svnurl = "http://core.svn.wordpress.org/trunk/";
$svnurl = "http://svn.automattic.com/wordpress/trunk/";
 
$nowversion = file_get_contents("version.txt");
$basedir = "../71j/";
$c = preg_replace("[\r\n]", "", file_get_contents($svnurl));
$v = preg_match("/Revision\s*([0-9]+)/", $c, $m);
if ($m[1] <= $nowversion) {
 echo "You have the latest version!";
} else {
 getdir();
}
file_put_contents("version.txt", $m[1]);
 
function getdir($pos = "") {
 global $svnurl, $basedir;
 $log = explode("\n", file_get_contents("log.txt"));
 array_pop($log);
 $c = file_get_contents($svnurl . $pos);
 preg_match_all("/<li><a\s+href=\".+?\">(.+?)<\/a><\/li>/i", $c, $m);
 
 foreach($m[1] as $n) {
  if ($n == "..") continue;
  if (strpos($n, ".") !== false) {
   if (!in_array($basedir . $pos . $n, $log) || end($log) == $basedir . $pos . $n) {
    !file_exists($basedir . $pos) && mkdir($basedir . $pos, 0777, true);
    file_put_contents($basedir . $pos . $n, file_get_contents($svnurl . $pos . $n));
    file_put_contents("log.txt", $basedir . $pos . $n . "\n", FILE_APPEND);
   }
  } else {
   getdir($pos . $n);
  }
 }
}
 
>

使用前要在本文件目录下放一个version.txt,记录svn版本号,同时要清空log.txt,因为这个记录断点续用的。

代码比较简陋,可以根据自己需要加以改进。

Categories: 感悟 Tags: ,

让php读取文件不在受内存限制0+

37,687 views / 2009.11.11 / 6:06 下午

php.ini里面的学问不少,我们在部署程序的时候最常修改的就是它了。这里介绍一个小小的技巧,可以让php打开文件的时候不再收内存限制(memory_limit)。

我们知道,要设置程序执行时间不受限制,只需要让max_execution_time = 0即可,是不是设置memory_limit = 0就能达到目的了呢?答案是否定的,正解如下:

memory_limit = -1

呵呵,有意思吗,朋友说这两个模块不是一个人写的,所以设置的值不一样(囧)。

Categories: 感悟 Tags: ,

同时兼容32位与64位机器的php hash函数2+

41,818 views / 2009.09.01 / 8:08 下午

时代在进步,社会在发展,64位机的出现导致移位元算不再很轻易溢出,这固然是件值得高兴的事情,可在系统迁移中,忽然发现64位机器hash函数得出的结果居然与32位不一样,震惊之余赶紧研究算法在发现是移位运算符号的问题。

没办法,只好对系统进行判断,并针对64位机器重写了算法,代码如下:

if (exec("getconf LONG_BIT") == "32") {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $_hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $_hash = ($_hash << 4) + ord($apszData[$i]);
   if (($x = $_hash &0xF0000000) != 0) {
    $_hash ^= ($x >> 24);
    $_hash &= ~$x;
   } 
  } 
  return ($_hash &0x7FFFFFFF) % $MAX_TABLE_NUM + 1;
 } 
} else {
 function _hash($apszData = "", $MAX_TABLE_NUM = 0) {
  $hash = $x = $i = 0;
  for($i = 0; $i < strlen($apszData); $i++) {
   $hash = ($hash << 4) + ((ord($apszData[$i])) << 32);
 
   if (($x = $hash &0xF000000000000000) != 0) {
    $hash ^= $x >> 24;
    $hash &= (~$x) &0xFFFFFFFF00000000;
   } 
  }
 
  $ret = ($hash &0x7FFFFFFF00000000) % ($MAX_TABLE_NUM << 32) + (1 << 32);
  $ret >>= 32;
  $ret &= 0xFFFFFFFF;
  return $ret;
 } 
}

如果你不知道hash函数的作用,请参阅 http://baike.baidu.com/view/20089.htm

Categories: 感悟 Tags: , ,