搞搞PHP 存档

php添加imagick扩展


wget http://pecl.php.net/get/imagick-3.3.0RC2.tgz
tar zxvf imagick-3.3.0RC2.tgz;cd imagick-3.3.0RC2.tgz;
phpize
yum install ImageMagick
./configure --with-php-config=/usr/local/php/bin/php-config
make test
make
make install
make test

=====================================================================
TIME END 2015-10-14 16:30:07

=====================================================================
TEST RESULT SUMMARY
———————————————————————
Exts skipped : 0
Exts tested : 47
———————————————————————

Number of tests : 27 27
Tests skipped : 0 ( 0.0%) ——–
Tests warned : 0 ( 0.0%) ( 0.0%)
Tests failed : 0 ( 0.0%) ( 0.0%)
Expected fail : 0 ( 0.0%) ( 0.0%)
Tests passed : 27 (100.0%) (100.0%)
———————————————————————
Time taken : 3 seconds
=====================================================================

make

[root@aoxiang imagick-3.3.0RC2]# make
Build complete.
Don’t forget to run ‘make test’.

make install

[root@aoxiang imagick-3.3.0RC2]# make install
Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
Installing header files: /usr/local/php/include/php/

安装完成,配置下php.ini

vim /usr/local/php/etc/php.ini
#添加一下内容
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/imagick.so
#保存退出
service php-fpm restart

添加imagick扩展之后,重启php-fpm,查看phpinfo多出了imagick

PHP开启Opcache性能对比

前阵子在群里,看到大庆提到opcache加速器,当时也不明白是什么,于是抽空研究了一下。发现php官方手册真的非常非常非常有必要通读一遍!!!!
opcache是zend出的一个缓存工具,先将php脚本预编译,缓存到内存中,需要用的时候就不用再次编译了。在php5.5的版本以后,php都内置了opcache。正好vps装的是5.4的,于是闲来无事安装下测试看看。
安装非常简单,一句即可

pecl install ZendOpcache

安装完成后会在php.ini中看到多了opcache

php.ini中的opcache

php.ini中的opcache

图中因为我在测试对比开启opcache前后的性能情况,我是注释了opcache。
注意一定要把opcache.so的位置写正确
添加一些配置内容

 opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

重启php后,我们在phpinfo中能看到多了opcache
前面介绍过xhprof的安装与使用,正好可以用xhprof测试下开启前后情况。仍然是以博客首页为测试对象。测试结果如下:

opcache开启前响应时间对比(单位:毫秒)
响应时间 开启前 开启后
659,185 407,844
516,839 325,101
585,206 450,047
483,782 445,568
518,558 425,767
851,166 359,448
495,277 349,735
561,613 471,427
600,126 644,085
平均值 585750.2222 431002.4444

 

明显开启后速度是有提高的。

Over~

Centos下http_load做压力测试

前阵子做了个小项目,很小很小的那种,但是这家公司确实很有钱很有钱的那种,赞助了某地方卫视黄金档综艺节目,于是乎,节目首播,客户担心服务器扛不住,于是乎有了我这种菜鸟试着玩一下压力测试。

安装很简单
可以到这里下载http_load http://www.acme.com/software/http_load/

mkdir http_load
cd http_load
wget http://www.acme.com/software/http_load/http_load-14aug2014.tar.gz
tar zxvf http_load-14aug2014.tar.gz
cd http_load-14aug2014
make
make install
vim urllist.txt#输入要做压力测试的url地址保存即可

这样就安装好了
下面要进行测试
也非常简单

-r 每秒访问多少次
-s 访问时长
-f 访问总次数

http_load -r 10 -s 10 urllist.txt 

下面看结果

每秒访问10次,共访问10秒,总计100次请求
[root@aoxiang http_load-14aug2014]# http_load -r 10 -s 10 urllist.txt
42 fetches, 58 max parallel, 1.94275e+06 bytes, in 10.0012 seconds
46256 mean bytes/connection
4.19951 fetches/sec, 194253 bytes/sec
msecs/connect: 1.88881 mean, 11.376 max, 1.164 min
msecs/first-response: 3268.35 mean, 5607.34 max, 534.501 min
HTTP response codes:
code 200 — 42

42 fetches, 58 max parallel, 1.94275e+06 bytes, in 10.0012 seconds
进行了42次请求,最大并发进程数58,总计传输 1.94275e+06 bytes,耗时10秒

46256 mean bytes/connection
每次请求平均传输数据量46256 bytes

4.19951 fetches/sec, 194253 bytes/sec
意味着系统最大每秒钟处理4.1次请求,每秒钟传输194253 bytes数据

msecs/connect: 1.88881 mean, 11.376 max, 1.164 min
平均响应时间1.8秒,最大响应时间 11.376msecs,最小响应时间1.164msecs

更详细的信息,可以参考百度百科《http_load》

Laravel5添加自定义类库

Laravel5中文文档比较少,写点东西出来看看骗点访问量好了。我没有用过其他本本,直接从Laravel5开始的,文档比较少,有时候看的也比较蛋疼。
废话不说,Laravel和其他框架Codeginiter、ThinkPHP之类的不一样的地方在于多了个命名空间的概念。所以第三方类库也需要定义namespace。

1、在App目录下建立classes\Common.php

这里的classes文件夹可以自定义的,不一定需要叫做classes

2、在Common.php中编写类及函数。

这里要注意需要指定第三方类库所在的命名空间,

namespace App\Classes;//定义命名空间
class Common
{
	public static function getPendingOrders()
	{
		echo "Include Library Success";
	}
}

3、在控制器中调用自定义类库。

在控制器中我们需要指定自定义类库所使用的命名空间

namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Classes\Common;//使用自定义类库的命名空间
use App\Http\Requests;
use App\Http\Controllers\Controller;

class TestController extends Controller
{
    public function index()
    {
        Common::getPendingOrders();//调用自定义类Common的方法
    }
}

Larave5引入自定义类库


完结,其实很简单吧

Zend Guard 代码加密详细步骤图解

最近想研究下Zend Guard给代码加密,以便以后做项目做好保密性,也方便以后客户抓在自己手上做维护。

这里分两步做

1、生成加密文件

2、配置服务器环境解密运行加密后的文件

一、生成加密文件
先抛出来Zend Guard相关安装包吧。

百度云下载Zend Guard.5.5

这里的注意以下2点:

  1. Zend Guard是需要收费的,下载的文件包里面有key,但是Key的有效期是10年7月10号。安装完成register的时候需要将系统时间调整到10年以前,[Help]->[Register]->[Search for a license file on my disk]
  2. key是试用版的,所以加密后的文件只能使用14天。你在生成加密文件以前可以将系统时间向后调整N年,比如2099年。这样就会在2099年以后14天过期。

PS:文件包中有个.zl,是激活用的。但是我们其实可以自己生成一个zl。可以选择不用它的。

下面上图按步骤走吧:

  1. 新建一个项目【File】-【New】-【Zend Guard Project】。这里主要填写下项目名称,以及最后一个加密后代码输出位置:OutputLocation:

    新建Zend Guard Project

    新建Zend Guard Project

  2. 选择代码所在文件夹

    选择代码所在文件夹

    选择代码所在文件夹

(更多…)

svn添加钩子hooks并解决hooks速度慢。

前几天安装好了SVN,然后想要提交之后直接放到web目录中,可以直接通过web访问页面效果。于是知道了有钩子这么个东西。
假设已经有了svn project,我们需要做一下操作:

  • 在web目录里面checkout对应的代码文件
  • 创建钩子模板并赋予执行权限
  • 敲入钩子文件的内容
  1. checkout代码的文件
    在web目录下创建网站对应的文件夹,我这里直接给文件夹命名为svn,并且checkout

    mkdir /home/wwwroot/svn 
    cd /home/wwwroot/svn
    svn checkout svn://127.0.0.1 ./
    

    完成以后目录下会多了.svn的隐藏文件夹

  2. 创建钩子
    在创建好svn project之后会有如下目录结构。我们的钩子就存放在hooks里面。

    svn目录

    我们需要做下面步骤:

    代码如下:

    cd hooks
    cp post-commit.tmpl post-commit #拷贝一个钩子模板
    chmod 777 post-commit #赋予可执行权限
    vim post-commit
    
  3. 编辑钩子文件
    找到/svn/svntest/hooks/post-commit,
    进入到post-commit编辑状态后,我们最好把里面的内容都给注释。然后敲入以下代码:

    #!/bin/sh
    SVN=/usr/bin/svn #svn执行文件所在的文件夹
    WEB=/home/wwwroot/svn #svn项目所在目录
    LOG_PATH=/svn/svntest/svn_hook.log #我们定义的一个log文件
    echo "------------Start Commit -----------" >> $LOG_PATH
    echo "Time:"`date '+%Y-%m-%d %T'`>>$LOG_PATH #这里是在日志中写入执行的时间
    cd $WEB
    for dir in 'svnlook dirs-changed /svn/svntest'  #查找有修改过的文件,并将修改过的内容部署到web目录
    do
            #下面一句执行update命令
            $SVN  update $WEB --username "aoxiang" --password "aoxiang" >> $LOG_PATH 
    done
    echo "------------Commit End---------------" >>$LOG_PATH
    

    这里解释一下代码:
    我在部署完钩子之后,发现有一个问题:

    在本地commit 到服务器以后,速度都很快显示100%,但是进度条会一直卡在最后不动很长时间。

    我的项目大概400MB,当时就怀疑是钩子的原因,导致commit速度下降。
    最后找到方法:

    先找到有修改的目录,然后将修改的内容部署到web目录,这样就不会把整个项目部署到web目录

    for dir in 'svnlook dirs-changed /svn/svntest' 
    do
        #这里是要执行的代码
    done
    

    svnlook dirs-changed命令用来找打修改过内容的目录

    下面一句就相当于是在我们对应的svn的目录里面执行了update命令

    $SVN update -N $WEB --username "aoxiang" --password "aoxiang" >> $LOG_PATH

以上基本上就ok了。今天主要被上传速度困扰了一天。后来找到方法先检查修改的文件后,顿时就搞定了

HTML5 Geolocation 获取地理位置

周四回家了一趟,其实发现火车上看书是一件很好的事情。我在书《HTML5 高级程序设计》中看到通过Geolocation获取地理位置,大概是一个测量运动距离的简单例子。立马来了兴趣,今天简单的实现了获取地理位置并显示到地图。

HTML5 Geolocation 获取地理位置

HTML5 Geolocation 获取地理位置

Geolocation是HTML5获取地理位置的一个API。整理书中资料和百度的资料。获取地理位置有4种方法

  1. GPS
  2. IP地址
  3. GSM\CDMA等网络基站
  4. 已知的WIFI的MAC地址

这四种方法都是我们立马能理解的。

  • IP地址在我们日常使用的情况下只能精确到城市、片区。
  • GSM\CDMA这些网络是根据三大运营商的基站来定位的,基站很多街道都有,相对IP地址来说更准确一些。
  • WIFI的MAC地址,反正到现在我没遇上过。我认为这个是要依托大数据为基础,才能做到精确。

我在书中看到的Geolocation的方法,是使用GPS的。程序会先发出希望使用地理位置的请求,需要用户同意。废话不多说,代码上:

(更多…)

利用php扫网站是否存在黑链

公司客户的网站经常被挂黑链,可能因为客户自己管理员密码没有保存好的原因把。于是需要做一个扫描黑链的工具,以方便清理黑链。罗总说采集,提取a标签中的href,再过滤来实现。可以用simple_html_dom这个插件来做。于是研究了一下。成功了。

下面贴代码:

<?php
/*
*代码来自:井底之蛙http://aoxiang.me
*文章地址:http://aoxiang.me/2012/12/577.html
*/
//设置最长执行时间无限制
set_time_limit(0);
//以只读的方式打开要扫描的txt文件
$r = fopen("d:\wamp\www\s\domain.txt","r");

//实例化simple_html_dom类
$html = new simple_html_dom();

//建立白名单
$b = fopen("d:\wamp\www\s\baimingdan.txt","r");
$while_list = array();

while(!feof($b))
{
	$while_domain = trim(fgets($b));
	array_push($while_list,$while_domain);
}

while(!feof($r))
{
	$domain = fgets($r);
	$domain = trim($domain);
	
	$whiles = $while_list;
	array_push($whiles,$domain);
	$yuming = trim(strtr($domain,"www"," "));
	array_push($whiles,$yuming);
	
	
	//这个地方建立扫描结果的文件。需要先在简历对应目录/heimingdan/
	$w = fopen("d:\wamp\www\s\heimingdan\\".$domain.".txt","w");
	$http_domain =  "http://".$domain;
	
	//检查域名是否能正常访问
	if(check_url_ok($http_domain))
	{
		//取得$damin这个域名的静态内容,例如http://www.baidu.com、取得的就是百度首页的html内容。
		$html->load_file($http_domain);

		//查找a标签
		$ret = $html->find('a');
		
		$i = 0;
		foreach($ret as $val)
		{
			//提取a标签中的href属性
			$link = $val->href;
			//过滤白名单
			if(del_while($link,$whiles))
			{
				$v = $link."\n";
				//写入文件
				if(fwrite($w,$v))
				{
					$i++;
				}
				
			}
		}
		echo $domain."扫描完毕,共发现<span style='color:red;font-weight:bold;'>".$i."</span>条可疑链接<a href='./heimingdan/".$domain.".txt'>点击查看可以链接</a><br/>";
	
	}else
	{
		echo $domain."无法访问<br/>";
	}
	
}

//删除白名单
function del_while($link,$while_list)
{
	$ok = false;
	$is_http = strpos($link,"http");
	if($is_http !== false)
	{
		foreach($while_list as $row)
		{
			$while = strpos($link,$row);
			if($while !== false)
			{
				$ok = true;
			}
		}
	}else
	{
		$ok = true;
	}
	
	if($ok)
	{
		return false;
	}else
	{
		return true;
	}
}


//检查域名是否能正常访问
function check_url_ok($url)
{
	$url_status = get_headers($url);
	$is_ok = $url_status[0];
	if(strpos($is_ok,"200") === false)
	{
		return false;
	}else
	{
		return true;
	}
}

?>

这玩意儿原理很简单的:

  • 给程序一个地址,然后程序可以通过采集的方法取得地址的html内容。
  • 取得html内容以后,再用正则去匹配a标签,提取href属性。
  • 取得href属性以后,再与白名单中地址进行比对,最终提出有嫌疑的链接

在我看来这是最有技术含量的方法了。我不喜欢用插件,但是插件真的很强大。

用simple_html_dom这个插件,就省去了写采集和提取a表情href属性的过程。哈哈。下次有时间得试一下用最原始的方法写。

文件已打包,提供下载地址:http://dl.vmall.com/c07xaps7ya

应该加上一句,做人要厚道,转载请注明来自:井底之蛙:http://aoxiang.me/2012/12/577.html

简单的php导入excel表到数据库

需要做一个功能导入一些数据到数据库里面,本来打算用phpexcel这个插件,张晓说有一个可以用的例子,于是把拿来看了看,真尼玛简单。下面把代码发出来做个记录,方便以后自己使用,也方便其他同行copy.

先我建了一个简单的表

CREATE TABLE IF NOT EXISTS `excel` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `domain` varchar(127) DEFAULT NULL,
  `fuzeren` varchar(127) DEFAULT NULL,
  `add_time` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

下面是php的代码。大部分都有注释。因为csv创建后直接是gbk神马的。,但是代码和数据库习惯用得是utf8的编码,csv转成utf8我是用notepad++打开设置格式,然后再wps编辑一些简单数据测试用的。

<?php
/*
*代码来自:井底之蛙http://aoxiang.me
*文章地址: http://aoxiang.me/2012/12/547.html
*/
header("content-type:text/html;charset=utf8");//设置字符编码
date_default_timezone_set("PRC");//设置时区
ini_set("display_errors",true);//开启错误提示
set_time_limit(0);//设置程序最长执行时间为无限制
setlocale(LC_ALL, 'zh_CN');
//ob_start();


$db = mysql_pconnect("localhost","root","") or die("链接Mysql失败");
mysql_select_db("test",$db) or die("选择数据库失败");
mysql_query("set names utf8",$db) or die("设置字符编码失败");
$csvfp = fopen("domain.csv","r") or die("打开CSV文件失败");
while($row=fgetcsv($csvfp)){
	$sql = "INSERT INTO excel(domain,fuzeren) VALUES('".$row[0]."','".$row[1]."')";
	mysql_query($sql);
}
?>

至于domain.csv这个文件,在下面的包里面有下载。整个文件sql,code,csv都放在打包放在华为网盘。有需要的可以去download

下载《简单的php导入excel表到数据库》

jpgraph折线图

<?php // content="text/plain; charset=utf-8"
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_line.php');

//Y轴数据
$ydata = array(11,3,8,12,5,1,9,13,5,7);

//设置图像大小
$width=450;
$height=250;

//初始化jpgraph并创建画布
$graph = new Graph($width,$height);
$graph->SetScale('intlin');

//设置左右上下距离
$graph->SetMargin(40,20,20,40);
//设置大标题
$graph->title->Set('Calls per operator');
//设置小标题
$graph->subtitle->Set('(March 12, 2008)');
//设置x轴title
$graph->xaxis->title->Set('Operator');
//设置y轴title
$graph->yaxis->title->Set('# of calls');
//设置x轴的值
$label_x  = array('a','b','c','d','e','f','g','h','i','j');
$graph->xaxis->SetTickLabels($label_x);


//实例化一个折线图的类并放入数据
$lineplot=new LinePlot($ydata);
//将折线图放入jpgraph
$graph->Add($lineplot);

//显示到浏览器
$graph->Stroke();
?>