2014年5月23日星期五

curl 和 file_get_contents 抓取网页乱码的解决之道

    今天用 curl_init 函数抓取搜狐的网页时,发现采集的网页时乱码,经过分析发现原来是服务器开启了gzip压缩功能。只要往函数 curl_setopt 添加多个选项 CURLOPT_ENCODING 解析 gzip 就可以正确解码了。


    还有如果抓取的网页时 GBK 编码,但是脚本确是 utf-8 编码,还得把抓取的网页再用函数 mb_convert_encoding 转换下。

<?php

    $tmp = sys_get_temp_dir();

    $cookieDump = tempnam($tmp, 'cookies');
    $url = 'http://tv.sohu.com';
    $ch = curl_init();
    curl_setopt ($ch, CURLOPT_URL, $url);
    curl_setopt ($ch, CURLOPT_HEADER, 1);// 显示返回的Header区域内容
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
    curl_setopt ($ch, CURLOPT_TIMEOUT, 10);// 设置超时限制
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT,10);// 链接超时限制
    curl_setopt ($ch, CURLOPT_HTTPHEADER,array('Accept-Encoding: gzip, deflate'));//设置 http 头信息
    curl_setopt ($ch, CURLOPT_ENCODING, 'gzip,deflate');//添加 gzip 解码的选项,即使网页没启用 gzip 也没关系
    curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookieDump);  // 存放Cookie信息的文件名称
    $content = curl_exec($ch);
    // 把抓取的网页由 GBK 转换成 UTF-8 
    $content = mb_convert_encoding($content,"UTF-8","GBK");
?>


<?php
    $url = 'http://tv.sohu.com';
    // 只要添加 compress.zlib 选项,即使服务器启用了gzip 压缩功能,就能够解码了
    $content = file_get_contents("compress.zlib://".$url);
    // 把抓取的网页由 GBK 转换成 UTF-8 
    $content = mb_convert_encoding($content,"UTF-8","GBK");

?>


2014年5月15日星期四

PHP 设置动态网页在浏览器的缓存


很多人可能不知道,动态网页在浏览器也是可以缓存的。下面就以 PHP 脚本为例子,阐述如何设置动态网页在浏览器缓存

<?php

//设置网页过期时间为1小时
$duetime = 3600*24*30;

//获取浏览器会向服务器传送 Last-Modified 报头
$modify_time =  $_SERVER['HTTP_IF_MODIFIED_SINCE'];

//当浏览器在设置时间之内再次访问该网页时,发送 HTTP 304 的状态码,这样就节省了传输数据量。
if(strtotime($modify_time) + $duetime > time())
{
header('HTTP/1.1 304');
exit(1);
}

header('Connection: keep-alive');
//设置网页 Last-Modified 报头
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
//设置网页过期时间
header('Expires: '.gmdate('D, d M Y H:i:s',time()+$duetime).' GMT');
//执行缓存时间长,跟 Expires 有点类似,让我们可以更全面的控制网页过期时间,因为浏览器时间可能跟服务器时间不协调,用  Cache-Control 报头可以得到限制
header('Cache-Control: max-age='.$duetime);

//输出内容
……
?>

2014年5月8日星期四

普通用户 mysqldump 导出数据库出现错误的解决办法

今天用 mysql 的一个普通用户 admin 用 mysqldump 工具进行备份的时候,出现以下错误

mysqldump: Got error: 1044: Access denied for user 'admin'@'localhost' to database 'mydatabase' when using LOCK TABLES


后来查阅网上资料,终于得到解决办法。只需添加 --single-transaction 选项。

$ mysqldump --single-transaction -u admin -p mydatabase > mydatabase.sql

2014年4月21日星期一

Linux 下的软件管家 YUM

    yum 是透过分析 RPM 的标头资料后, 根据各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的依赖属性问题,以解决软件安装或移除与升级的问题。

    举个形象的例子:你要安装 NetBeans 集成开发环境,你首先要 rpm 命令先安装 JDK ,然后才能够成功安装 NetBeans 。如果用 YUM 命令,系统会自动先帮你安装 JDK,再帮你安装 NetBeans 。

    注释:关于 RPM机制 参考这儿:http://woqilin.blogspot.com/2014/02/linux.html

    简单来说,它相当于360软件管家、腾讯电脑管家。不同的是,YUM 是通过命令行来管理的。

利用 yum 进行查询


[root@www ~]# yum [option] [查询工作项目] [相关参数]
选项与参数:
[option]:主要的选项,包括有:
  -y :当 yum 要等待使用者输入时,这个选项可以自动提供 yes 的回应;
  --installroot=/some/path :将该软件安装在 /some/path 而不使用预设路径
[查询工作项目] [相关参数]:这方面的参数有:
  search  :搜寻某个软件名称或者是描述 (description) 的重要关键字;
  list    :列出目前 yum 所管理的所有的软件名称与版本,有点类似 rpm -qa;
  info    :同上,不过有点类似 rpm -qai 的执行结果;
  provides:从文件去搜寻软件!类似 rpm -qf 的功能!

范例一:搜寻磁碟阵列 (raid) 相关的软件有哪些?
[root@www ~]# yum search raid
....(前面省略)....
mdadm.i386 : mdadm controls Linux md devices (software RAID arrays)
lvm2.i386 : Userland logical volume management tools
....(后面省略)....
# 在冒号 (:)  左边的是软件名称,右边的则是在 RPM 内的 name 设定 (软件名)
# 瞧!上面的结果,这不就是与 RAID 有关的软件吗?如果想了解 mdadm 的软件内容呢?

范例二:找出 mdadm 这个软件的功能为何
[root@www ~]# yum info mdadm
Installed Packages      <==这说明该软件是已经安装的了
Name   : mdadm          <==这个软件的名称
Arch   : i386           <==这个软件的编译架构
Version: 2.6.4          <==此软件的版本
Release: 1.el5          <==释出的版本
Size   : 1.7 M          <==此软件的文件总容量
Repo   : installed      <==容器回报说已安装的
Summary: mdadm controls Linux md devices (software RAID arrays)
Description:            <==看到否?这就是 rpm -qi 
mdadm is used to create, manage, and monitor Linux MD (software RAID)
devices.  As such, it provides similar functionality to the raidtools
package.  However, mdadm is a single program, and it can perform
almost all functions without a configuration file, though a configuration
file can be used to help with some common tasks.


范例三:列出 yum 服务器上面提供的所有软件名称
[root@www ~]# yum list
Installed Packages <==已安装软件
Deployment_Guide-en-US.noarch            5.2-9.el5.centos       installed
Deployment_Guide-zh-CN.noarch            5.2-9.el5.centos       installed
Deployment_Guide-zh-TW.noarch            5.2-9.el5.centos       installed
....(中间省略)....
Available Packages <==还可以安装的其他软件
Cluster_Administration-as-IN.noarch      5.2-1.el5.centos       base
Cluster_Administration-bn-IN.noarch      5.2-1.el5.centos       base
....(底下省略)....
# 上面提供的意义为:『 软件名称   版本   在那个容器内 』

范例四:列出目前服务器上可供本机进行升级的软件有哪些?
[root@www ~]# yum list updates  
Updated Packages
Deployment_Guide-en-US.noarch            5.2-11.el5.centos      base
Deployment_Guide-zh-CN.noarch            5.2-11.el5.centos      base
Deployment_Guide-zh-TW.noarch            5.2-11.el5.centos      base
....(底下省略)....
# 上面就列出在那个容器内可以提供升级的软件与版本!

范例五:列出提供 passwd 这个文件的软件有哪些
[root@www ~]# yum provides passwd
passwd.i386 : The passwd utility for setting/changing passwords using PAM
passwd.i386 : The passwd utility for setting/changing passwords using PAM
# 找到!就是上面的这个软件提供了 passwd 这个程序!


上一篇:Linux 的软件管理器

2014年2月17日星期一

Linux 查看系统资源命令

进程的查看

[root@linux ~]# ps aux        <==查看系统所有的进程数据
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 1740 540 ? S Jul25 0:01 init [3]
root 2 0.0 0.0 0 0 ? SN Jul25 0:00 [ksoftirqd/0]
root 3 0.0 0.0 0 0 ? S< Jul25 0:00 [events/0]
.....中间省略.....
root 5881 0.0 0.3 5212 1204 pts/0 S 10:22 0:00 su
root 5882 0.0 0.3 5396 1524 pts/0 S 10:22 0:00 bash
root 6142 0.0 0.2 4488 916 pts/0 R+ 11:45 0:00 ps aux


各字段的意义为:
• USER:该 process 属于那个使用者账号的?
• PID :该 process 的号码。
• %CPU:该 process 使用掉的 CPU 资源百分比;
• %MEM:该 process 所占用的物理内存百分比;
• VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
• RSS :该 process 占用的固定的内存量 (Kbytes)
• TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。
• STAT:该程序目前的状态,主要的状态有:
o R :该程序目前正在运作,或者是可被运作;
o S :该程序目前正在睡眠当中 (可说是 idle 状态啦!),但可被某些讯号 (signal) 唤醒。
o T :该程序目前正在侦测或者是停止了;
o Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态
• START:该 process 被触发启动的时间;
• TIME :该 process 实际使用 CPU 运作的时间。
• COMMAND:该进程的实际命令


[root@linux ~]# ps -l      <==仅查看自己的bash相关进程
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 5881 5654 0 76 0 - 1303 wait pts/0 00:00:00 su
4 S 0 5882 5881 0 75 0 - 1349 wait pts/0 00:00:00 bash
4 R 0 6037 5882 0 76 0 - 1111 - pts/0 00:00:00 ps
# 上面这个信息其实很多喔!各相关信息的意义为:
# F 代表这个程序的旗标 (flag), 4 代表使用者为 super user;
# S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍;
# PID 没问题吧!?就是这个程序的 ID 啊!底下的 PPID 则上父程序的 ID;
# C CPU 使用的资源百分比
# PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍;
# NI 这个是 Nice 值,在下一小节我们会持续介绍。
# ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running
的程序,一般就是『 - 』的啦!
# SZ 使用掉的内存大小;
# WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作;
# TTY 登入者的终端机位置,若为远程登录则使用动态终端接口(pts/n)
# TIME 使用掉的 CPU 时间。
# CMD 所下达的指令为何!?


范例:找出与 cron 与 syslog 这两个服务有关的 PID 号码?
[root@linux ~]# ps aux | egrep '(cron|syslog)'
root 1539 0.0 0.1 1616 616 ? Ss Jul25 0:03 syslogd -m 0
root 1676 0.0 0.2 4544 1128 ? Ss Jul25 0:00 crond
root 6157 0.0 0.1 3764 664 pts/0 R+ 12:10 0:00 egrep (cron|syslog)



iostat 命令为你提供系统的不同信息,包括CPU时间的统计、I/O设备、分区和网络文件系统(NFS)。

[root@AY1407070046165819beZ ~]# iostat
Linux 2.6.32-431.17.1.el6.x86_64 (AY1407070046165819beZ)        01/16/2017      _x86_64_        (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.73    0.00    0.20    0.93    0.00   98.14

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
xvda              3.15        45.60        17.01 1773055956  661424568

xvdb              0.00         0.00         0.00       1392          0


# 例如,如果 %idle低,可以确定系统一直很忙碌。高%iowait表明磁盘出现问题。如果 %system 或 %nice 比 %user 高,则表明系统失衡且级别高的进程阻止普通进程的运行。

系统资源的查看

[root@linux ~]# free [-b|-k|-m|-g] [-t]
参数:
-b :直接输入 free 时,显示的单位是 Kbytes,我们可以使用 b(bytes), m(Mbytes)
k(Kbytes), 及 g(Gbytes) 来显示单位喔!
-t :在输出的最终结果,显示物理内存与 swap 的总量。
范例:
范例一:显示目前系统的内存容量
[root@linux ~]# free -m
total used free shared buffers cached
Mem: 376 366 10 0 129 94
-/+ buffers/cache: 141 235
Swap: 996 0 995





RPM 软件管理程序命令详解

RPM 默认安装的路径


/etc 一些设置文件放置的目录,例如 /etc/crontab
/usr/bin 一些可执行文件
/usr/lib 一些程序使用的动态函数库
/usr/share/doc 一些基本的软件使用手册与帮助文档
/usr/share/man 一些 man page 文件


RPM 安装

如果要安装一个文件名为 rp-pppoe-3.5-32.1.i386.rpm 的文件,只需这样:



[root@www ~]# rpm -i rp-pppoe-3.5-32.1.i386.rpm

说明:

rp-pppoe   -        3.5     -      32             .i386         .rpm
软件名称      软件的版本信息   发布的次数     适合的硬件平台   扩展名



显示安装进度

[root@www ~]# rpm -ivh package_name



选项与参数:

-i :install 的意思

-v :查看更详细的安装信息画面

-h :以安装信息栏显示安装进度



范例一:找出你的 Linux 是否有安装 logrotate 这个软件
[root@www ~]# rpm -q logrotate
logrotate-3.7.4-8
[root@www ~]# rpm -q logrotating
package logrotating is not installed
# 注意到,系统会去找是否有安装后面接的软件名称。注意,
# 不必要加上版本。至于显示的结果,一看就知道有没有安装。

范例二:列出上题当中,属于该软件所提供的所有目录与文件:
[root@www ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
....(以下省略)....
# 可以看出该软件到底提供了多少的档桉与目录,也可以追踪软件的资料。

范例三:列出 logrotate 这个软件的相关说明资料:
[root@www ~]# rpm -qi logrotate
Name        : logrotate             Relocations: (not relocatable)
Version     : 3.7.4                      Vendor: CentOS
Release     : 8                      Build Date: Sun 02 Dec 2007 08:38:06 AM CST
Install Date: Sat 09 May 2009 11:59:05 PM CST    Build Host: builder6
Group       : System Environment/Base  Source RPM: logrotate-3.7.4-8.src.rpm
Size        : 53618                     License: GPL
Signature   : DSA/SHA1, Sun 02 Dec 2007 09:10:01 AM CST, Key ID a8a447dce8562897
Summary     : Rotates, compresses, removes and mails system log files.
Description :
The logrotate utility is designed to simplify the administration of
log files on a system which generates a lot of log files.  Logrotate
allows for the automatic rotation compression, removal and mailing of
log files.  Logrotate can be set to handle a log file daily, weekly,
monthly or when the log file gets to a certain size.  Normally,
logrotate runs as a daily cron job.

Install the logrotate package if you need a utility to deal with the
log files on your system.
# 列出该软件的 information (资讯),里面的信息可多着呢,包括了软件名称、
# 版本、开发商、SRPM文件名称、打包次数、简单说明信息讯、软件打包者、
# 安装日期等!如果想要详细的知道该软件的资料,用这个参数来了解一下

范例四:分别仅找出 logrotate 的设定文件与说明文件
[root@www ~]# rpm -qc logrotate
[root@www ~]# rpm -qd logrotate

范例五:若要成功安装 logrotate ,他还需要什么文件的帮忙?
[root@www ~]# rpm -qR logrotate
/bin/sh
config(logrotate) = 3.7.4-8
libc.so.6
....(以下省略)....


范例六:由上面的范例五,找出 /bin/sh 是那个软件提供的?
[root@www ~]# rpm -qf /bin/sh
bash-3.2-21.el5
# 这个参数后面接的可是『文件』!不像前面都是接软件!
# 这个功能在查询系统的某个文件属于哪一个软件所有的。


范例七:假设我有下载一个 RPM 文件,想要知道该文件的需求文件,该如何办?
[root@www ~]# rpm -qpR filename.i386.rpm
# 加上 -qpR ,找出该文件需求的数据!

RPM 卸载与重建数据库


# 1. 找出与 pam 有关的软件名称,并尝试删除 pam 这个软件:
[root@www ~]# rpm -qa | grep pam
pam-devel-0.99.6.2-3.27.el5
pam_passwdqc-1.0.2-1.2.2
pam_pkcs11-0.5.3-23
pam_smb-1.1.7-7.2.1
pam-0.99.6.2-3.27.el5
pam_ccreds-3-5
pam_krb5-2.2.14-1
[root@www ~]# rpm -e pam
error: Failed dependencies:  <== 发生软件依赖导致无法删除某些软件
        libpam.so.0 is needed by (installed) coreutils-5.97-14.el5.i386
        libpam.so.0 is needed by (installed) libuser-0.54.7-2.el5.5.i386
....(以下省略)....

# 2. 若仅删除 pam-devel 这个之前范例安装上的软件呢?
[root@www ~]# rpm -e pam-devel  <==不会出现任何信息!
[root@www ~]# rpm -q pam-devel
package pam-devel is not installed


由于 RPM 文件常常会安装/删除/升级等,某些操作或许可能会导致 RPM 数据库 /var/lib/rpm/ 内的文件损坏。

[root@www ~]# rpm --rebuilddb   <==重建数据库


上一篇:Linux 的软件管理器
下一篇:Linux 下的软件管家 YUM

2014年2月14日星期五

Linux 的软件管理器

    Linux 有类似 Windows 控制面板下面的“添加或删除程序”软件管理器。在 Linux 上面至少就有两种常见的这方面的软件管理器,分别是 Red Hat 的 RPM 与 Debian 的 dpkg 。

dpkg

    这个机制最早是由Debian Linux 社群所开发出来的,透过dpkg 的机制, Debian 提供的软体就能够简单的安装起来,同时还能提供安装后的软体资讯,实在非常不错。 只要是衍生于Debian 的其他 Linux distributions 大多使用dpkg 这个机制来管理软体的, 包括B2D, Ubuntu 等等。

RPM 

   这个机制最早是由Red Hat 这家公司开发出来的,后来实在很好用,因此很多distributions 就使用这个机制来作为软体安装的管理方式。 包括Fedora, CentOS, SuSE 等知名的开发商都是用它。



distribution 代表 软件管理机制 使用命令 在线升级机制(命令)
Red Hat/Fedora RPM rpm, rpmbuild YUM (yum)
Debian/Ubuntu DPKG dpkg APT (apt-get)

下面我们来谈谈软件管理机制 RPM ,在线升级的方式为 yum 的相关说明。

RPM 与 SRPM

    RPM 全名是『 RedHat Package Manager 』简称则为 RPM 。顾名思义,当初这个软体管理的机制是由 Red Hat 这家公司发展出来的。 RPM 是一种以数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。

优点:


  • 由于已经编译完成并且打包完毕,所以软体传输与安装上很方便 (不需要再重新编译);
  • 由于软体的资讯都已经记录在 Linux 主机的资料库上,很方便查询、升级与卸载。


劣势:


  • 软件安装的环境必须与打包时的环境需求一致或相当;
  • 需要满足软件的依赖属性需求;
  • 卸载时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题!


    SRPM 是什么呢?顾名思义,它是 Source RPM 的意思,也就是这个 RPM 文件里面含有源代码。SRPM 所提供的软件内容并没有经过编译。安装该软件时必须要:


  • 先将该软件以 RPM 管理的方式编译,此时 SRPM 会被编译成为 RPM 文件;
  • 然后将编译完成的 RPM 文件安装到 Linux 系统当中。



文件格式文件名格式直接安装与否內含程序类型可否修改参数并编译
RPMxxx.rpm已编译不可
SRPMxxx.src.rpm不可未编译的源代码


下一篇:RPM 软件管理程序命令详解

2014年1月21日星期二

PHP curl_init 设置HTTP服务器认证

    使用 PHP 的 cURL 库去抓取网页时,有时会遇到 HTTP 服务器需要进行身份验证的情况,这时候该怎么设置呢?

需要进行身份验证

<?php

    $url = "http://192.168.0.100:8080/JM-PLATFORM/sms/MobsetSendSMS/sysId/oa/mobileNum/{$mobile_phone}/message/{$message}";

    $tmp = sys_get_temp_dir();
    $cookieDump = tempnam($tmp, 'cookies');
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //设置存放 Cookie 的文件
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieDump);
    //设置 Http 身份验证的方法,这里有多个选项可以选择,可参考 php 手册
    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    //设置 用户名和密码
    curl_setopt($ch, CURLOPT_USERPWD,'User:Password');
    $output = curl_exec($ch);
    curl_close($ch);
    echo $output;

?>