//压缩文件 $zipper=new Zipper(); $zipper->make($dir.'.zip')->add($dir); $zipper->close(); return response()->download(public_path($dir.'.zip'));
//压缩文件 $zipper=new Zipper(); $zipper->make($dir.'.zip')->add($dir); $zipper->close(); return response()->download(public_path($dir.'.zip'));
清理配置缓存(当你添加配置文件或修改配置文件时一定要清理,否则无法读取新增配置文件或变动):
php artisan config:clear
清理文件缓存:
php artisan cache:clear
<?php /** * RSA加密 * env:(PHP 4 >= 4.0.4, PHP 5, PHP 7) * 密钥对生成 * 工具:OpenSSL * 生成私钥:genrsa -out rsa_private_key.pem 1024 * 生成公钥:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem * Author:luchanglong * Date:2017-12-14 * ********************************************** * * 私钥丢失将导致数据永久无法解密 * ********************************************* */ header("Content-type: text/html; charset=utf-8"); class RsaTools { //私钥文件路径 private $rsaPrivateKeyFilePath; //私钥值 private $rsaPrivateKey; //公钥文件路径 private $rsaPublicKeyFilePath; //公钥值 private $rsaPublicKey; function __construct() { $this->rsaPrivateKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_private_key.pem'; $this->rsaPublicKeyFilePath=dirname(__FILE__).DIRECTORY_SEPARATOR.'key'.DIRECTORY_SEPARATOR.'rsa_public_key.pem'; } /** * rsa公钥加密 **/ public function rsaEncrypt($data) { if($this->checkEmpty($this->rsaPublicKeyFilePath)){ //读取字符串 $pubKey= $this->rsaPublicKey; $res = "-----BEGIN PUBLIC KEY-----\n" . wordwrap($pubKey, 64, "\n", true) . "\n-----END PUBLIC KEY-----"; }else { //读取公钥文件 $pubKey = file_get_contents($this->rsaPublicKeyFilePath); //转换为openssl格式密钥 $res = openssl_get_publickey($pubKey); } ($res) or die('RSA公钥错误。请检查公钥文件格式是否正确'); $data=trim($data); openssl_public_encrypt($data,$encrypted,$pubKey);//公钥加密 $encrypted = base64_encode($encrypted); return $encrypted; } /** * rsa私钥解密 **/ public function rsaDecrypt($data) { if($this->checkEmpty($this->rsaPrivateKeyFilePath)){ //读字符串 $priKey=$this->rsaPrivateKey; $res = "-----BEGIN RSA PRIVATE KEY-----\n" . wordwrap($priKey, 64, "\n", true) . "\n-----END RSA PRIVATE KEY-----"; }else { $priKey = file_get_contents($this->rsaPrivateKeyFilePath); $res = openssl_get_privatekey($priKey); } ($res) or die('您使用的私钥格式错误,请检查RSA私钥配置'); $data=base64_decode($data); openssl_private_decrypt($data, $dcyCont, $res); return $dcyCont; } /** * 校验$value是否非空 * if not set ,return true; * if is null , return true; **/ protected function checkEmpty($value) { if (!isset($value)) return true; if ($value === null) return true; if (trim($value) === "") return true; return false; } } $r=new RsaTools(); $str="0123456789?><~!@#$%^&*()_+qwertyuiopasdfghjklzxcvbnm"; echo '待加密:'.$str."<br>"; $en=$r->rsaEncrypt($str); echo '加密后:'.$en.'<br>'; $de=$r->rsaDecrypt($en); echo '解密后:'.$de;
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节。比如两个字节可以表示的最大整数是65535
,4个字节可以表示的最大整数是4294967295
使用composer 安装时出现错误 requires ext-curl * -> the requested PHP extension curl is missing from your system
ubuntu
使用php5
sudo apt-get install php5-curl
使用php7.0
sudo apt-get install php7.0-curl
使用 php7.1
sudo apt-get install php7.1-curl
/** * 缓存所有商品分类 * @return mixed */ static function findAllCache() { //开发期间不缓存,直接返回所有分类 return $goodsCate = self::select('*')->orderBy('pid', 'ASC')->orderBy('sort', 'ASC')->get()->toArray(); /* if(Cache::has('goods_cate')){ $goodsCate = Cache::get('goods_cate'); }else{ $goodsCate = self::select('*')->orderBy('pid', 'ASC')->orderBy('sort', 'ASC')->get()->toArray(); Cache::put('goods_cate',$goodsCate,1*24); } return $goodsCate;*/ } /** * 所有分类=>树形数组 * 将查询到的所有分类转换成树形返回 * @param array $cate 所有分类,可以使用findAllCache() 查询 * @param int $pid 初始父级 * @return mixed */ static function getTree(array $cate,$pid=0){ $result = array(); foreach($cate as $v){ if($v['pid'] == $pid){ $v['children'] =self::getTree($cate,$v['id']); $result[] = $v; } } return $result; } /** * 一维数组=>树形带option数组 * 返回options递归信息 * @param array $data 全部分类 * @param int $pid * @param int $level * @return string */ static function getTreeOption($data,$pid = 0,$level=0){ $result = ''; $j=0; foreach($data as $v){ if($v['pid'] == $pid){ $delimit=''; if($level){ for($i=1;$i<=$level;$i++){ $delimit .= ' '; } } else { $delimit = ''; } $result .= '<option value="'.$v['id'].'">'.$delimit.$v['title'].'</option>'; $result .= self::getTreeOption($data,$v['id'],$level+1); } } return $result; } /** * 所有分类=>顶级分类 * 将查询到的所有分类转换成顶级一维html option返回 * @param array $data 所有分类 * @param int $pid 初始父级 * @return mixed */ static function getParentHtml($data,$pid = 0,$level=0,$delimit = ''){ $result = array(); foreach($data as $v){ if($v['pid'] == $pid){ if($level){ for($i=1;$i<=$level;$i++){ $delimit .= ' '; } } else { $delimit = ''; } $result[] = '<option value="'.$v['id'].'">'.$delimit.$v['title'].'</option>'; $res = self::getTreeOption($data,$v['id'],$level+1); if(is_array($res)){ foreach($res as $v2){ $result[] = $v2; } } } } return $result; }
echo sprintf(”%05d”,1);
先说%05d的意思,用一个5位数的数字格式化后边的参数,如果不足5位就补零
在类UNIX的系统中,PHP(除了CLI模式)默认在/usr/local/lib路径寻找php.ini文件。为了让它更加“shell式”,CLI模式默认寻找/etc/php-cli.ini,用做代替。这可以让你的web服务器和CLI/shell脚本保持单独的php.ini文件,而无需再你每次运行一个php的脚本时设置-c选项。
不同的Unix/linux系统发布版绑定PHP时,经常使用它们自己默认的php.ini位置;你可以通过你的PHP执行文件加上get_cfg_var(“cfg_file_path”)来找到该文件。
压力测试:
php的压力测试一般有两种方法法
1.ab工具 。ApacheBench的缩写。它是绑定到apache中的,也可以单独安装。
$ab -n 1000 -c 10 http://localhost/index.php
2.Siege。可以一个测试多个地址。
$ siege -i -t 10S -f urls.txt
性能分析:
1.ZendStudio 的Profiler来进行性能分析
2.使用APD(Advanced PHP Debugger)进行性能分析。一般来说用的就是这个。
3.使用Xdebug进行性能分析。这个比较偏向于代码调试。当然如果配置了Ccachegrind还是很好用的。
.使用APC(Advanced PHP Cache)。opcache 可以大大的加快你php的运行速度。
安装
sudo apt-get install apache2-utils
测试:
ab -c 20 -n 1000 http://www.example.com/
-c:并发数
-n:总请求数
ab运行完成后会有比较详细的结果
Server Software: web服务器软件及版本
Server Hostname: 请求的地址
Server Port: 请求的端口
Document Path: 请求的页面路径
Document Length: 页面大小
Concurrency Level: 并发数
Time taken for tests: 测试总共花费的时间
Complete requests: 完成的请求数
Failed requests: 失败的请求数
Write errors: 写入错误
Total transferred: 总共传输字节数,包含http的头信息等
HTML transferred: html字节数,实际的页面传递字节数
Requests per second: 每秒处理的请求数,服务器的吞吐量(重要)
Time per request: 平均数,用户平均请求等待时间
Time per request: 服务器平均处理时间
Transfer rate: 平均传输速率(每秒收到的速率)
参数说明:
-n即requests,用于指定压力测试总共的执行次数。
-c即concurrency,用于指定压力测试的并发数。
-t即timelimit,等待响应的最大时间(单位:秒)。
-b即windowsize,TCP发送/接收的缓冲大小(单位:字节)。
-p即postfile,发送POST请求时需要上传的文件,此外还必须设置-T
参数。
-u即putfile,发送PUT请求时需要上传的文件,此外还必须设置-T
参数。
-T即content-type,用于设置Content-Type请求头信息,例如:application/x-www-form-urlencoded
,默认值为text/plain
。
-v即verbosity,指定打印帮助信息的冗余级别。
-w以HTML表格形式打印结果。-i使用HEAD请求代替GET请求。
-x插入字符串作为table标签的属性。-y插入字符串作为tr标签的属性。
-z插入字符串作为td标签的属性。
-C添加cookie信息,例如:”Apache=1234″(可以重复该参数选项以添加多个)。
-H添加任意的请求头,例如:”Accept-Encoding: gzip”,请求头将会添加在现有的多个请求头之后(可以重复该参数选项以添加多个)。
-A添加一个基本的网络认证信息,用户名和密码之间用英文冒号隔开。
-P添加一个基本的代理认证信息,用户名和密码之间用英文冒号隔开。
-X指定使用的代理服务器和端口号,例如:”126.10.10.3:88″。
-V打印版本号并退出。
-k使用HTTP的KeepAlive特性。
-d不显示百分比。
-S不显示预估和警告信息。
-g输出结果信息到gnuplot格式的文件中。
-e输出结果信息到CSV格式的文件中。
-r指定接收到错误信息时不退出程序。
-h显示用法信息,其实就是ab -help
。