ofly 发表的文章

查看linux文件目录的大小和文件夹包含的文件数

查看linux文件目录的大小和文件夹包含的文件数

    统计总数大小

    du -sh xmldb/

    du -sm * | sort -n //统计当前目录大小 并安大小 排序

    du -sk * | sort -n

    du -sk * | grep guojf //看一个人的大小

    du -m | cut -d "/" -f 2 //看第二个/ 字符前的文字

    查看此文件夹有多少文件 /*/*/* 有多少文件

    du xmldb/

    du xmldb/*/*/* |wc -l

    40752

    解释:

    wc [-lmw]

    参数说明:

    -l :多少行

    -m:多少字符

    -w:多少字

mysql中“Table ‘’ is read only”的解决办法

之前是在linux下面直接Copy的data下面整个数据库文件夹,在phpMyAdmin里面重新赋予新用户相应权限后,drupal成功连接上数据库。但出现N多行错误提示,都是跟Cache相关的表是‘Read only‘,而且phpMyAdmin里面优化表也是提示”Table ‘xxx’ is read only“。
我怀疑是文件权限的问题,所以将该数据库文件夹下面所有表文件chmod成777,chown成”_mysql”,但这次问题更严重,drupal里面现实table crached。没办法,马上Google,发现其实解决起来挺容易的。

首先,找到mysqladmin所在位置,一般都在mysql/bin下面,然后运行一下命令:

./mysqladmin -u root -p flush-tables

之后输入root账号的密码,马上就好了,没有任何任何提示,重新打开drupal,一切正常。

通过这次,也找到了数据库文件的正确权限设置:data下面数据库文件夹700,表文件660,所有文件都应owned by mysql。

PHP抓取网页图片

<?php
 set_time_limit(0);//抓取不受时间限制
 if($_POST['Submit']=="开始抓取"){
  $URL=$_POST['link'];
  get_pic($URL);
 }
 function get_pic($pic_url) {
  //获取图片二进制流
  $data=CurlGet($pic_url);
  //利用正则表达式得到图片链接
  $pattern_src1 = '/<img.*?src\=\"(.*\.jpg).*?>/';//只匹配jpg格式的图片
  $pattern_src2 = '/<img.*?src\=\"(.*\.bmp).*?>/';//只匹配bmp格式的图片
  $pattern_src3 = '/<img.*?src\=\"(.*\.png).*?>/';//只匹配png格式的图片
  $pattern_src4 = '/<img.*?src\=\"(.*\.gif).*?>/';//只匹配gif格式的图片
  $num1 = preg_match_all($pattern_src1, $data, $match_src1);
  $num2 = preg_match_all($pattern_src2, $data, $match_src2);
  $num3 = preg_match_all($pattern_src3, $data, $match_src3);
  $num4 = preg_match_all($pattern_src4, $data, $match_src4);
  $arr_src1=$match_src1[1];//获得图片数组
  $arr_src2=$match_src2[1];
  $arr_src3=$match_src3[1];
  $arr_src4=$match_src4[1];
  echo '=============================================抓取开始=============================================<br />';
  get_name1($arr_src1);
  get_name1($arr_src2);
  get_name1($arr_src3);
  get_name1($arr_src4);
  get_name2($arr_src1);
  get_name2($arr_src2);
  get_name2($arr_src3);
  get_name2($arr_src4);
  
  echo '=============================================抓取结束=============================================<br />';
  return 0;
 }
 
 function get_name1($pic_arr){
  //图片编号和类型
  $pattern_type = '/.*\/(.*?)$/';
  
  foreach($pic_arr as $pic_item){//循环取出每幅图的地址
   $num = preg_match_all($pattern_type,$pic_item,$match_type);
   //以流的形式保存图片
   $write_fd = @fopen($match_type[1][0],"wb");
   echo "图片网址:<a href='".$pic_item."' target='_blank'>".$pic_item."</a><br />";
   @fwrite($write_fd, CurlGet($pic_item));
   @fclose($write_fd);
  }
  return 0;
 }
  function get_name2($pic_arr){
  //图片编号和类型
  $pattern_type = '/.*\/(.*?)$/';
  
  foreach($pic_arr as $pic_item){//循环取出每幅图的地址
   $num = preg_match_all($pattern_type,$pic_item,$match_type);
   //以流的形式保存图片
   $write_fd = @fopen($match_type[1][0],"wb");
   echo "图片网址:<a href='".$_POST['link'].$pic_item."' target='_blank'>".$_POST['link'].$pic_item."</a><br />";
   @fwrite($write_fd, CurlGet($_POST['link'].$pic_item));
   @fclose($write_fd);
  }
  return 0;
 }
 //抓取网页内容
 function CurlGet($url){ 
  $url=str_replace('&amp;','&',$url);
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, $url);
  curl_setopt($curl, CURLOPT_HEADER, false);
  
  //curl_setopt($curl, CURLOPT_REFERER,$url);
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; SeaPort/1.2; Windows NT 5.1; SV1; InfoPath.2)");
  curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt');
  curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt');
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 0);
  $values = curl_exec($curl);
  curl_close($curl);
  return $values;
 }
?>
<html>
 <head>
  <title>网页图片抓取</title>
 </head>
 <body>
  <form action="" method="post">
   要抓取图片的网址:<input type="text" id="link" name="link" value="请在这里输入要抓取图片的网址" OnClick="this.value=''" size="100" /><br />
   <input type="submit" id="Submit" name="Submit" value="开始抓取" />
  </form>
 </body>
</html>

couldn't resolve host api.weixin.qq.com

从这个报错,可以很明显的发现是域名解析不了。于是做如下排查。 
1. 故障排除 
1. 1 测试域名是否能解析到 
简单的使用ping来测试,发现DNS解析是否OK。

ping -c 1 api.weixin.qq.com


1.2 测试curl是否有故障 
因为php程序调用的是curl,所以我们测试一下curl是否能够正常解析dns 
curl  api.weixin.qq.com 
竟然真的不行, 
2. 解决问题 
尝试解决方法: 
修改dns 
cat /etc/resolv.conf | grep names 
nameserver 114.114.114.114

nameserver 8.8.8.8 
重新测试curl,问题得到解决。 
修改/etc/resolv.conf又恢复到原来的状态? 
设置一次可以,过一会或者重启一下服务器,重启一下network都不能解析了。发现/etc/resolv.conf又恢复到原来的状态,里面什么都没有了。手动加入nameserver也不行。 
后来到网上查找,发现有人与我同样的问题。原来在CentOS5.4下面直接修改/etc/resolv.conf不行。必须要在/etc /sysconfig/network-scripts/ifcfg-eth0里面最后加上dns的设置。要不然,重启后,肯定使用eth0设置中没有设 dns的相关信息,使/etc/resolv.conf恢复到原来的状态。 
打开/etc/sysconfig/network-scripts/ifcfg-eth0,为了保险起见,可以同样修改eth1的设置 
DEVICE=eth0 
  BOOTPROTO=none 
  HWADDR=00:xx:19:xx:xx:xx 
  ONBOOT=yes 
  TYPE=Ethernet 
  USERCTL=no 
  IPV6INIT=no 
  PEERDNS=yes 
  NETMASK=255.255.255.0 
  IPADDR=xxx.xxx.xxx.xxx 
  GATEWAY=xxx.xxx.xxx.xxx 
  DNS1=202.96.209.5 #上海dns,根据实际情况更换 
  DNS2=202.96.209.133 #上海dns,根据实际情况更换 
这样设置后,/etc/resolv.conf里面根本就不需要设置。service network restart 后,可以发现/etc/resolv.conf里面就有两个dns的解析ip了。配置好以后重启网络,cat /etc/resolv.conf,可以看到如下参数: 
# Generated by NetworkManager 
  nameserver 202.96.209.5 
  nameserver 202.96.209.133 
  search localdomain 
DNS解析设置成功。 
  在此要强调一点的是,直接修改/etc/resolv.conf这个文件是没用的,网络服务重启以后会根据/etc/sysconfig /network-scripts/ifcfg-eth0来重载配置,如果ifcfg-eth0没有配置DNS,那么resolv.conf会被冲掉,重 新变成空值。

上海东方有线插广告一点节操都没有的垃圾公司

上海东方有线太缺德,赚钱没有一点底线,机顶盒的作用是看数字电视的,虽然你是免费赠送,可是我们是付费高清用户,用你这破玩意是来看广告的吗,你们机顶盒里开机有广告,换台有广告,调节音量都有广告,还有底线没有!还有节操没!







PHP中读取文件的几个方法

整理了一下PHP中读取文件的几个方法,方便以后查阅。
1.fread
  string fread ( int $handle , int $length )
  fread() 从 handle 指向的文件中读取最多 length 个字节。该函数在读取完最多 length 个字节数,或到达 EOF 的时候,或(对于网络流)当一个包可用时,或(在打开用户空间流之后)已读取了 8192 个字节时就会停止读取文件,视乎先碰到哪种情况。
  fread() 返回所读取的字符串,如果出错返回 FALSE。
复制代码
<?php
    $filename = "/usr/local/something.txt";
    $handle = fopen($filename, "r");//读取二进制文件时,需要将第二个参数设置成'rb'
    
    //通过filesize获得文件大小,将整个文件一下子读到一个字符串中
    $contents = fread($handle, filesize ($filename));
    fclose($handle);
?>
复制代码

  如果所要读取的文件不是本地普通文件,而是远程文件或者流文件,就不能用这种方法,因为,filesize不能获得这些文件的大小。此时,你需要通过feof()或者fread()的返回值判断是否已经读取到了文件的末尾。
  例如:
复制代码
<?php
    $handle = fopen('http://www.baidu.com', 'r');
    $content = '';
    while(!feof($handle)){
        $content .= fread($handle, 8080);
    }
    echo $content;
    fclose($handle);
?>
复制代码
或者:
复制代码
<?php
    $handle = fopen('http://www.baidu.com', 'r');
    $content = '';
    while(false != ($a = fread($handle, 8080))){//返回false表示已经读取到文件末尾
        $content .= $a;
    }
    echo $content;
    fclose($handle);
?>
复制代码
 
2.fgets
  string fgets ( int $handle [, int $length ] )
  fgets()从 handle 指向的文件中读取一行并返回长度最多为 length - 1 字节的字符串。碰到换行符(包括在返回值中)、EOF 或者已经读取了 length - 1 字节后停止(看先碰到那一种情况)。如果没有指定 length,则默认为 1K,或者说 1024 字节。
复制代码
<?php
    $handle = fopen('./file.txt', 'r');
    while(!feof($handle)){
        echo fgets($handle, 1024);
    }
    fclose($handle);
?>
复制代码
  Note: length 参数从 PHP 4.2.0 起成为可选项,如果忽略,则行的长度被假定为 1024。从 PHP 4.3 开始,忽略掉 length 将继续从流中读取数据直到行结束。如果文件中的大多数行都大于 8KB,则在脚本中指定最大行的长度在利用资源上更为有效。从 PHP 4.3 开始本函数可以安全用于二进制文件。早期的版本则不行。

3.fgetss
  string fgetss ( resource $handle [, int $length [, string $allowable_tags ]] )
  跟fgets功能一样,但是fgetss会尝试从读取的文本中去掉任何 HTML 和 PHP 标记,可以用可选的第三个参数指定哪些标记不被去掉。
复制代码
<?php
    $handle = fopen('./file.txt', 'r');
    while(!feof($handle)){
        echo fgetss($handle, 1024, '<br>');
    }
    fclose($handle);
?>
复制代码
 
4.file
  array file ( string $filename [, int $use_include_path [, resource $context ]] )
  将文件内容读入一个数组中,数组的每一项对应文件中的一行,包括换行符在内。不需要行结束符时可以使用 rtrim() 函数过滤换行符。
复制代码
<?php
    $a = file('./file.txt');
    foreach($a as $line => $content){
        echo 'line '.($line + 1).':'.$content;
    }
?>
复制代码

 5.readfile
  int readfile ( string $filename [, bool $use_include_path [, resource $context ]] )
  读入一个文件并写入到输出缓冲。返回从文件中读入的字节数。如果出错返回 FALSE 并且除非是以 @readfile() 形式调用,否则会显示错误信息。
<?php
    $size = readfile('./file.txt');
    echo $size;
?>
 
6.file_get_contents
  string file_get_contents ( string $filename [, bool $use_include_path [, resource $context [, int $offset [, int $maxlen ]]]] )
  将文件读入一个字符串。第三个参数$context可以用来设置一些参数,比如访问远程文件时,设置超时等等。
  另外,file_get_contents相对于以上几个函数,性能要好得多,所以应该优先考虑使用file_get_contents。但是readfile貌似比file_get_contents性能好一点(?),因为它不需要调用fopen。
复制代码
<?php 
    $ctx = stream_context_create(array( 
        'http' => array( 
            'timeout' => 1    //设置超时
            ) 
        ) 
    ); 
    echo file_get_contents("http://www.baidu.com/", 0, $ctx); 
?>
复制代码

7.fpassthru
   int fpassthru ( resource $handle )
  将给定的文件指针从当前的位置读取到 EOF 并把结果写到输出缓冲区。
复制代码
<?php 
    header("Content-Type:text/html;charset=utf-8"); 
    $handle = fopen('./test2.php', 'r');
    fseek($handle, 1024);//将指针定位到1024字节处
    fpassthru($handle);
?>
复制代码
 
8.parse_ini_file
  array parse_ini_file ( string $filename [, bool $process_sections ] )
  parse_ini_file() 载入一个由 filename 指定的 ini 文件,并将其中的设置作为一个联合数组返回。如果将最后的 process_sections 参数设为 TRUE,将得到一个多维数组,包括了配置文件中每一节的名称和设置。process_sections 的默认值是 FALSE。
  注意:
1. 如果 ini 文件中的值包含任何非字母数字的字符,需要将其括在双引号中(")。
2. 有些保留字不能作为 ini 文件中的键名,包括:null,yes,no,true 和 false。值为 null,no 和 false 等效于 "",值为 yes 和 true 等效于 "1"。字符 {}|&~![()" 也不能用在键名的任何地方,而且这些字符在选项值中有着特殊的意义。
test.ini文件内容:
复制代码
; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username
复制代码
test.php内容:
<?php 
    $config = parse_ini_file('./test.ini', ture);
    print_r($config);
?>
输出内容:
复制代码
Array
(
    [first_section] => Array
        (
            [one] => 1
            [five] => 5
            [animal] => BIRD
        )

    [second_section] => Array
        (
            [path] => /usr/local/bin
            [URL] => http://www.example.com/~username
        )

)
复制代码
 
 
 
几个注意事项:
  1. 鼓励在处理二进制文件时使用 b 标志,即使系统并不需要,这样可以使脚本的移植性更好。 
  2. allow_url_fopen选项激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象例如文件。默认的封装协议提供用 ftp 和 http 协议来访问远程文件,一些扩展库例如 zlib 可能会注册更多的封装协议。出于安全性考虑,此选项只能在 php.ini 中设置。
  3. 如果要打开有特殊字符的 URL (比如说有空格),就需要使用 urlencode() 进行 URL 编码。

记事狗微博在Nginx服务器下的伪静态规则

location / {        index index.html index.php;        if (-f $request_filename/index.html){            rewrite (.*) $1/index.html break;        }        if (-f $request_filename/index.php){            rewrite (.*) $1/index.php;        }        if (!-f $request_filename){            rewrite (.*) /index.php;        }    }

Linux 下zip包的压缩与解压

linux zip 命令详解 
功能说明:压缩文件。 
语 法:zip [-AcdDfFghjJKlLmoqrSTuvVwXyz$][-b <工作目录>][-ll][-n <字尾字符串>][-t <日期时间>][-<压缩效率>][压缩文件][文件...][-i <范本样式>][-x <范本样式>] 
补充说明:zip是个使用广泛的压缩程序,文件经它压缩后会另外产生具有".zip"扩展名的压缩文件。 
参 数: 
-A 调整可执行的自动解压缩文件。 
-b<工作目录> 指定暂时存放文件的目录。 
-c 替每个被压缩的文件加上注释。 
-d 从压缩文件内删除指定的文件。 
-D 压缩文件内不建立目录名称。 
-f 此参数的效果和指定"-u"参数类似,但不仅更新既有文件,如果某些文件原本不存在于压缩文件内,使用本参数会一并将其加入压缩文件中。 
-F 尝试修复已损坏的压缩文件。 
-g 将文件压缩后附加在既有的压缩文件之后,而非另行建立新的压缩文件。 
-h 在线帮助。 
-i<范本样式> 只压缩符合条件的文件。 
-j 只保存文件名称及其内容,而不存放任何目录名称。 
-J 删除压缩文件前面不必要的数据。 
-k 使用MS-DOS兼容格式的文件名称。 
-l 压缩文件时,把LF字符置换成LF+CR字符。 
-ll 压缩文件时,把LF+CR字符置换成LF字符。 
-L 显示版权信息。 
-m 将文件压缩并加入压缩文件后,删除原始文件,即把文件移到压缩文件中。 
-n<字尾字符串> 不压缩具有特定字尾字符串的文件。 
-o 以压缩文件内拥有最新更改时间的文件为准,将压缩文件的更改时间设成和该文件相同。 
-q 不显示指令执行过程。 
-r 递归处理,将指定目录下的所有文件和子目录一并处理。 
-S 包含系统和隐藏文件。 
-t<日期时间> 把压缩文件的日期设成指定的日期。 
-T 检查备份文件内的每个文件是否正确无误。 
-u 更换较新的文件到压缩文件内。 
-v 显示指令执行过程或显示版本信息。 
-V 保存VMS操作系统的文件属性。 
-w 在文件名称里假如版本编号,本参数仅在VMS操作系统下有效。 
-x<范本样式> 压缩时排除符合条件的文件。 
-X 不保存额外的文件属性。 
-y 直接保存符号连接,而非该连接所指向的文件,本参数仅在UNIX之类的系统下有效。 
-z 替压缩文件加上注释。 
-$ 保存第一个被压缩文件所在磁盘的卷册名称。 
-<压缩效率> 压缩效率是一个介于1-9的数值。


linux unzip 命令详解

功能说明:解压缩zip文件

语 法:unzip [-cflptuvz][-agCjLMnoqsVX][-P <密码>][.zip文件][文件][-d <目录>][-x <文件>] 或 unzip [-Z]

补充说明:unzip为.zip压缩文件的解压缩程序。

参 数:

-c 将解压缩的结果显示到屏幕上,并对字符做适当的转换。

-f 更新现有的文件。

-l 显示压缩文件内所包含的文件。

-p 与-c参数类似,会将解压缩的结果显示到屏幕上,但不会执行任何的转换。

-t 检查压缩文件是否正确。

-u 与-f参数类似,但是除了更新现有的文件外,也会将压缩文件中的其他文件解压缩到目录中。

-v 执行是时显示详细的信息。

-z 仅显示压缩文件的备注文字。

-a 对文本文件进行必要的字符转换。

-b 不要对文本文件进行字符转换。

-C 压缩文件中的文件名称区分大小写。

-j 不处理压缩文件中原有的目录路径。

-L 将压缩文件中的全部文件名改为小写。

-M 将输出结果送到more程序处理。

-n 解压缩时不要覆盖原有的文件。

-o 不必先询问用户,unzip执行后覆盖原有文件。

-P<密码> 使用zip的密码选项。

-q 执行时不显示任何信息。

-s 将文件名中的空白字符转换为底线字符。

-V 保留VMS的文件版本信息。

-X 解压缩时同时回存文件原来的UID/GID。

[.zip文件] 指定.zip压缩文件。

[文件] 指定要处理.zip压缩文件中的哪些文件。

-d<目录> 指定文件解压缩后所要存储的目录。

-x<文件> 指定不要处理.zip压缩文件中的哪些文件。

-Z unzip -Z等于执行zipinfo指令


范例:

zip命令可以用来将文件压缩成为常用的zip格式。unzip命令则用来解压缩zip文件。

1. 我想把一个文件abc.txt和一个目录dir1压缩成为yasuo.zip:

# zip -r yasuo.zip abc.txt dir1

2.我下载了一个yasuo.zip文件,想解压缩:

# unzip yasuo.zip

3.我当前目录下有abc1.zip,abc2.zip和abc3.zip,我想一起解压缩它们:

# unzip abc\?.zip

注释:?表示一个字符,如果用*表示任意多个字符。

4.我有一个很大的压缩文件large.zip,我不想解压缩,只想看看它里面有什么:

# unzip -v large.zip

5.我下载了一个压缩文件large.zip,想验证一下这个压缩文件是否下载完全了

# unzip -t large.zip

6.我用-v选项发现music.zip压缩文件里面有很多目录和子目录,并且子目录中其实都是歌曲mp3文件,我想把这些文件都下载到第一级目录,而不是一层一层建目录:

# unzip -j music.zip