本文针对PHP5.5等高级版本,编译时需要加上--enable-opcache参数
编译PHP请参考编译PHP5.6
编译安装完成后,我们开始配置Opcache
[Opcache]
zend_extension = opcache.so
opcache.enable=1
opcache.memory_consumption = 64
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 4000
opcache.revalidate_freq = 60
opcache.fast_shutdown = 1
opcache.enable_cli = 1
修改后重启PHP-FPM
service php-fpm restart
最后上个图
本教程我们用PHP实例来讲解冒泡排序法,快速排序法,选择排序法,插入排序法等四大基础排序算法,我们的重点是给出算法思路,这种思路同样适用于其他编程语言。四大基本排序算法分别是:冒泡排序法,快速排序法,选择排序法,插入排序法,本文我们用 PHP 实例讲解这四大基本排序。
1. 冒泡排序
思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。
代码实现:
$arr=array(1,43,54,62,21,66,32,78,36,76,39);
function bubbleSort($arr)
{
$len=count($arr);
//该层循环控制 需要冒泡的轮数
for($i=1;$i<$len;$i++)
{ //该层循环用来控制每轮 冒出一个数 需要比较的次数
for($k=0;$k<$len-$i;$k++)
{
if($arr[$k]>$arr[$k+1])
{
$tmp=$arr[$k+1];
$arr[$k+1]=$arr[$k];
$arr[$k]=$tmp;
}
}
}
return $arr;
}
2. 选择排序
代码实现:
function selectSort($arr) {
//双重循环完成,外层控制轮数,内层控制比较次数
$len=count($arr);
for($i=0; $i<$len-1; $i++) {
//先假设最小的值的位置
$p = $i;
for($j=$i+1; $j<$len; $j++) {
//$arr[$p] 是当前已知的最小值
if($arr[$p] > $arr[$j]) {
//比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。
$p = $j;
}
}
//已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
if($p != $i) {
$tmp = $arr[$p];
$arr[$p] = $arr[$i];
$arr[$i] = $tmp;
}
}
//返回最终结果
return $arr;
}
3.插入排序
思路分析:在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。
代码实现:
function insertSort($arr) {
$len=count($arr);
for($i=1, $i<$len; $i++) {
$tmp = $arr[$i];
//内层循环控制,比较并插入
for($j=$i-1;$j>=0;$j--) {
if($tmp < $arr[$j]) {
//发现插入的元素要小,交换位置,将后边的元素与前面的元素互换
$arr[$j+1] = $arr[$j];
$arr[$j] = $tmp;
} else {
//如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。
break;
}
}
}
return $arr;
}
4.快速排序
思路分析:选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。
代码实现:
function quickSort($arr) {
//先判断是否需要继续进行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//选择第一个元素作为基准
$base_num = $arr[0];
//遍历除了标尺外的所有元素,按照大小关系放入两个数组内
//初始化两个数组
$left_array = array(); //小于基准的
$right_array = array(); //大于基准的
for($i=1; $i<$length; $i++) {
if($base_num > $arr[$i]) {
//放入左边数组
$left_array[] = $arr[$i];
} else {
//放入右边
$right_array[] = $arr[$i];
}
}
//再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
$left_array = quick_sort($left_array);
$right_array = quick_sort($right_array);
//合并
return array_merge($left_array, array($base_num), $right_array);
}
php中str_split函数不支持中文分割,我们可以利用mb_xx函数实现
/**
* Convert a string to an array
* @param string $str
* @param number $split_length
* @return multitype:string
*/
function mb_str_split($str,$split_length=1,$charset="UTF-8"){
if(func_num_args()==1){
return preg_split('/(?<!^)(?!$)/u', $str);
}
if($split_length<1)return false;
$len = mb_strlen($str, $charset);
$arr = array();
for($i=0;$i<$len;$i+=$split_length){
$s = mb_substr($str, $i, $split_length, $charset);
$arr[] = $s;
}
return $arr;
}
方法二:
function mbStrSplit ($string, $len=1) {
$start = 0;
$strlen = mb_strlen($string);
while ($strlen) {
$array[] = mb_substr($string,$start,$len,"utf8");
$string = mb_substr($string, $len, $strlen,"utf8");
$strlen = mb_strlen($string);
}
return $array;
}
php "str_split"函数分割中文字符串乱码问题
问:
// 测试分割中文
$str2="轻轻地我走了,正如我轻轻的来。";
echo "原字符串:<b>$str2.</b><br/>";
echo "1、以指定长度为5分割字符串:<br/>";
$arr3=str_split($str2,5);
echo "--\$arr3[0]的值:"."$arr3[0]"."<br/>";
echo "--\$arr3[1]的值:"."$arr3[1]";
结果是:
原字符串:轻轻地我走了,正如我轻轻的来。.
1、以指定长度为5分割字符串:
--$arr3[0]的值:轻轼br/>--$arr3[1]的值:?地漯body>
乱码!!求解释,求真相!
答:
一个解决方案.
测试发现,preg_split对中文(多字节)的分隔符处理可能真的存在问题.
原因可能是正则匹配时不能正常分隔一个多字节字符(猜测).
但我实验用半角(英文)的分隔符就工作得很好.
于是
我在处理待分隔的文本前先对文本进行替换,把中文的句点和逗号都替换成英文半角的.然后再使用preg_split,暂时发现工作得不错.
以下是我的测试代码.
<?php
$test = <<<EOF
记者从有关人士处获悉,嫦娥二号发射的各项准备工作全部就绪,昨日经专家组评审,卫星、火箭、发射场、测控等系统均情况正常,具备发射条件。今天起,西昌卫星发射中心的加注手将为火箭加注燃料。
据一位航天专家介绍,因为地球和月球都在转动的缘故,所以地月之间的最佳交汇点每年仅出现3次,而这3次便是发射探月卫星的最佳节点,经过观测,今年3次的出现时间分别为10月1日、10月2日和10月3日,而最佳发射窗口则是1日晚7时,2日晚8时和3日晚10时,其中国庆日晚7时为佳中之佳。
针对媒体称10月1日发射窗口时间为晚6时59分57秒,该专家告诉本报记者,早3秒并非提前3秒发射,而是将这3秒时间预留出来,作为现场指挥员在发送倒计时口令的缓冲时间。(记者万强)
EOF;
//$input = $_POST[$content]; //........................获取要分割的字符串
$test = str_replace(",",',',$test);
$test = str_replace("。",'.',$test);
$mode="/[,|.]/s"; //......................用“逗号” 和 “句号” 分割字符串
$output = preg_split($mode,$test,-1);
print_r($output);
?>
============
楼主不防试试,我的代码是gb2312的字串.
经测试在,字符串为UTF8时,也可以正常工作.
在做图片上传时用到了symfony第三方上传库,详见 Symfony2使用第三方库Upload制作图片上传【原创】,但是对于多图片上传怎么处理,这里我用了个笨办法就是把多图片数组转换成单个的图片数组上传!
表单提交如下:
接受的图片信息的数组如下:
所以对此做一些处理,单个图片依次上传,如下:
if (isset($_FILES['image']) && $_FILES['image']['name']) {
$file = $_FILES['image'];
$num = count ($_FILES['image']['name']); //计算上传的图片数量
// 处理数组
for ($i=0;$i < $num;$i++) {
$data[$i]['name'] = $file['name'][$i];
$data[$i]['type'] = $file['type'][$i];
$data[$i]['tmp_name'] = $file['tmp_name'][$i];
$data[$i]['error'] = $file['error'][$i];
$data[$i]['size'] = $file['size'][$i];
}
foreach ($data as $key => $val) {
$_FILES['image'] = $val;
if(move_uploaded_file($val['name'], './',$val['name'])){
echo '<img" width=100% src="'.$path.$image_name.'" class="preview">';
}else{
echo '上传出错了!';
}
}
$info['image'] = serialize($img); // 序列化数组存数据库
$conn->insert('maintenance', $info);
}
这算是比较偷懒的做法,有不对的地方还望多多指教!
注意:fileUpload('image')是一个上传类了,各位可以参考下来来看看 move_uploaded_file($value, $savepath);
文件上传最简单的就是一个表单用户选择图片之后点击上传了,如果希望用户体验好点,我们可以使用ajax或iframe来上传了,下面一起来看一个例子。在一个网站项目中,为了得到更好的用户体验,很多地方都要处理成异步无刷新的效果。此文件上传范例是利用一个隐藏的框架iframe做桥梁,实现主体页面上传文件无刷新的效果。
其实本范例也不是真正的异步效果,但是也是可以达到无刷新效果的。而且这种方法是实现php无刷新上传文件最快捷,最简单的方法,所以何乐而不为呢。
html代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>php实现无刷新文件上传源码-代潇瑞博客</title>
<script type="text/javascript"" width=100% src="jquery-1.8.0.min.js"></script>
<script type="text/javascript">
function ajax_upload(fname){
if(fname){
$(".label1").html("上传成功:("+fname+")");
var obj = document.getElementById('upfile');
obj.outerHTML=obj.outerHTML;
}else{
$(".label1").html("上传失败!!");
}
$("#upButton").val("上 传").removeAttr("disabled");
}
function check_file(){
if($("#upfile").val()==""){
$(".label1").html("请先选择一个文件!");
return false;
}else{
$("#upButton").val("上传中...").attr("disabled","disabled");
return true;
}
}
</script>
</head>
<body>
<p><input type="text" /></p>
<form action="deal_upload.php" method="post" target="upimgf" enctype="multipart/form-data" onsubmit="return check_file()">
<p>请选择图片:<input type="file" name="img" id="upfile" /></p>
<p><label class="label1" style="color:red;"></label></p>
<p><input type="submit" value="上 传" id="upButton" /></p>
</form>
<iframe name="upimgf" style="display:none;"></iframe>
</body>
</html>
php代码
<?php
header("Content-type:text/html;charset=utf-8");
$up_file = $_FILES['img'];
$file_name = $up_file['name'];
//print_r($file_name);
if(move_uploaded_file($up_file['tmp_name'],iconv("utf-8","gb2312",$file_name))){
echo "<script> parent.ajax_upload('".$file_name."'); </script>";
}else{
echo "<script> parent.ajax_upload(''); </script>";
}
?>
当然上在这段上传没有做任何的一个安全验证了,我们如果要处理 可以进行一些处理 了。