
//压缩文件 $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。