分类: PHP教程 |
预览模式: 普通 | 列表

php7 unset数组元素会不会释放内存

 针对这个问题, 我们先上一段代码. 

<?php
$memory2 = $memory3 = $memory4 = 0;
$data = [];
$memory = memory_get_usage();
foreach (range(1, 100000) as $key) {
	$data[$key] = str_repeat("1', 100);
}

$memory2 = memory_get_usage() - $memory;

foreach (range(1, 100000) as $key) {
	unset($data[$key]);
}

$memory3 = memory_get_usage() - $memory;

echo "memory2: " . $memory2, PHP_EOL;
echo "memory3: " . $memory3, PHP_EOL;

这段代码分别会输出3个内存使用情况. 分别记为memory2, memory3. 

memory2: 给数组设置10000个key, 给value字段设置100个1的字符串. 之后的内存. 

memory3: unset掉数据中所有的key之后的内存值. 

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 12423

array_unshift的性能问题

 最近在看php的源码, 看数组这一块的时候发现了一个事情, 分享一下. 

这个array_unshift函数平时使用也不是太多, 所以平时可能没太在意. 先看下源码. 

这里显示array_unshift时,会创建一个新的数组, 把参数中的插入后再把原数组的数据接在后面. 也就是每unshift一个元素, 整个数组都要移动一遍, 这样的效率是很低的. 我们来测试一下, 验证我们的猜想. 

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 12543

不加全文索引解决模糊查询的问题

 模糊查询是我们在开发中经常会碰到的问题, 比如会员列表会根据用户昵称搜索会员, 根据商品标题搜索商品之类的. 如果数据量不是很大(比方说100W以内), 又没有比如文章内容的情况下可以不需要搞全文索引. 

比如我们的场景是这样的, SAAS软件可能会有多公司, 每个公司下有很多的会员. 我们现在需要搜索某个公司下昵称中包含"远洋"的这样一些会员. member表包含600多万条数据, 其中company_id=184306的用户的会员有82W. 

 

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 12680

PHP错误显示问题, 错误日志去哪儿了

相信很多做PHP开发的同学都会遇到一些PHP报错的情况. 有时候这些报错显示在页面上,有时候显示在日志文件里. 有时候可能会为一个500错误找半天, 却还是没有找到报在在哪里.

下面就根据地我一点点粗浅的认识总结一下这个问题.

开启error_reporting

要想看到错误, 第一件是就是开启error_reporting, 否则所有的错误都不会被报告. 开启的代码为:

error_reporting(E_ALL);

开启了错误报告之后, 我们可能在下面三个地方看到这个错误信息.

  1. 网页页面上. 
  2. nginx日志中.
  3. php错误日志中.

display_errors

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 75370

让git忽略已跟踪文件的修改

项目中的配置文件在版本管理中有时候会让我们很头疼. 服务器的环境可能不一样, 开发人员的开发环境也可能不一样. 对于这样的配置文件, 一种办法是干脆不加入版本控制. 但这样一来, 配置文件的改动需要用其它方法通知所有相关的开发人员. 而加入版本控制又会带来新的问题. 开发人员需要改配置, 提交的时候要小心翼翼的, 生怕把这个配置文件提交上去. 

对于用git做版本控制的项目来说, 有一种两全的办法.

你可以把一个配置文件加入到版本控制中, 同时你可以在开发者本地忽略这个文件的修改. 命令如下:

$ git update-index --assume-unchanged /path/to/file       #忽略跟踪
$ git update-index --no-assume-unchanged /path/to/file  #恢复跟踪

 当你断言一个文件是unchanged状态的时候, git不再去检查它的状态. 但是当远程分支对这个文件有更新的时候, 将会提示用户这个文件需要合并. 

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 125684

PHP BOM头导致COOKIE无法输出

带BOM头的UTF8文件, 其文件头部占三个字节(0xEF 0xBB 0xBF). 现在有很多的编辑器都可以识别BOM头了, 但还是有一些不能. 比如说PHP就无法识别这个标记. 所以PHP执行的时候会把它当作非PHP脚本直接输出. 

而由于http协议限制setcookie是必需在所有的内容发送调用, 只要有任何的空白内容在setcookie执行之前执行了setcookie将会报一个warning, 且不会输出任何COOKIE

 

这么明显的问题在开发的时候一定会被发现, 但是, 但是, 但是(关键点)很多人调用setcookie时加了一个@符号号来关闭一个函数调用的输出. 

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 136780

curl设置代理

设置SOCK5代理

curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
curl_setopt($ch, CURLOPT_PROXY, "127.0.0.1:1080");

设置HTTP代理

curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
curl_setopt($ch, CURLOPT_PROXY, "http://127.0.0.1:1080");

 

 

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 135788

微信支付接口开发 视频教程

## Part1

 
### 准备工作:
 
0. 注册公众号
1. 认证公众号
2. 开通微信支付
3. 取得公众号appid & secret
4. 取得微信支付 商户号 & paysecret & 支付证书
 
### 步骤:
 
0. 取得用户的openid
1. 创建商户自己的订单
2. 统一下单
3. H5调起支付API
4. 处理支付通知(成功/失败)
 
### 安全性
 
微信支付整个过程中是否存在不安全性

## Part2
 
微信支付中的各种坑

## Part3
 
PHP实战开发
分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 133756

PHP图片处理库 Intervention Image

 操作图片比较方便。要求PHP5.4以上,有fileinfo扩展。图片处理驱动可以是GD也可以是imagick, 也就是说这两个扩展也必需安装其一。

// include composer autoload
require "vendor/autoload.php';

// import the Intervention Image Manager Class
use Intervention\Image\ImageManager;

// create an image manager instance with favored driver
$manager = new ImageManager(array('driver' => 'imagick'));

// to finally create image instances
$image = $manager->make('public/foo.jpg')->resize(300, 200);
分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 53390

php输出字符串方法集

代码开关如下, 

<?php
$str = "http://www.zeroplace.cn'."\n";

1. echo
echo $str;

2. printf
printf($str);

3 php://output
file_put_contents('php://output', $str); $fp = fopen("php://output", 'w'); fwrite($fp, $str); fclose($fp);

查看更多...

Tags: php

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 47798

yii2查询条件where的基础写法

 yii2提供了很强大的sql构造工具类。基于sql查询主要与的是查询条件,所以我简单的翻译了一下yii2中where子句的写法。

如果是数组,有两种格式:

  • hash表格式: ['列1' => '值1', '列2' => '值2', ...]
  • 操作码模式:[操作码, 操作数1, 操作数2]

hash表格式

通常会产生column1=value1 AND column2=value2 AND ...。如果值是一个数组,会产生一个in表达式。如果值是null, 会产生一个is null

操作码格式

将根据操作码产生SQL表达式。表达式可以是如下:

  • and 所有的操作数表达式全部用and连接
  • or 同上,所有操作数用or连接
  • not 只接受一个操作数
  • between ['between', 'id', 1, 10] 将会产生 id BETWEEN 1 AND 10
  • not between 同上
  • in 第一个操作数是列名,第二个是一个数组或是一个数据库表达式。
  • not in 同上
  • like 第一个操作数是一个列名或一个数据库表达式,第二个操作数是like的表达式。如['like', 'name', 'tester'] will generate name LIKE '%tester%'
  • or like
  • or not like
  • exists 第一个操作数是一个子查询。
  • 其它操作码,比如['>=', 'id', 10]将会产生,id>=10
分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 44128

preg_match_all的两种用法

 preg_match_all的作用是把一个字符串中所有与正则表达式匹配的文本提取出来。一般人只知道它的一种用法,其实它还有另外一种用法。首先看它的原型。

int preg_match_all ( string pattern, string subject, array matches [, int flags] )

pattern是正则,subject是待匹配的字符串,matches是匹配的结果。最后一个flag是一个标记。

第一种用法。

<?php
$html = "http://www.zeroplace.cn/default.asp?cateID=28\nhttp://www.zeroplace.cn/default.asp?cateID=27";

$pattern = "/http:\/\/www\.zeroplace\.cn\/default\.asp\?cateID=(\d+)/";

preg_match_all($pattern, $html, $matches);
print_r($matches);

它的输出是:

Array
(
    [0] => Array
        (
            [0] => http://www.zeroplace.cn/default.asp?cateID=28
            [1] => http://www.zeroplace.cn/default.asp?cateID=27
        )

    [1] => Array
        (
            [0] => 28
            [1] => 27
        )

)

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 22567

 yii2 去掉 index.php

 yii2中配置urlManager的enablePrettyUrl为true后,实际上是使用了php中pathinfo的方式来获取路由,所以在路径中会有一个index.php。有一些同学需要更加美化url的会想直接把index.php也去掉。

这在yii2中很好实现,就是配置urlManager的showScriptName属性,这个属性只在enablePrettyUrl为true时才生效。

$config = [
    "id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'components' => [
    	'urlManager' => [
    		'enablePrettyUrl' => true,
    		'showScriptName' => false,
    	],
    ]
]
分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 18445

composer环境变量家目录

 安装好composer后会有一些默认设置,这些默认值如下:

COMPOSER_HOME: 这是composer的家目录,如果环境变量中没有设置这个值,在Windows中是C:\Users\\AppData\Roaming\Composer, linux中是/home//.composer, 在OSX中是/Users//.composer。也可以在环境变量中设置这个值。

在这个目录下,存放着一些全局配置。默认情况下,还有一些缓存。

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 13417

PHP5.4的内置HTTP服务器

 自从php5.4版本开始,PHP内部就集成了一个HTTP服务器。虽然是一个简单的服务器,但对开发人员临时调试还是提供不少方便的。这遍文章就是介绍一下这个服务器的使用。

这个服务器是以命令行的方便提供。

启动服务器

php -S localhost:8889 -t H:\php_wwwroot

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 10368

PHP使用GuzzleHttp发送HTTP请求

 之前的文章有讲到php调用curl发送http请求,但curl这种过程式的调用有时候是有点不方便的,各种参数的设置太麻烦。以至于我一写到curl就要去找找以前写的代码来拷贝。

如果使用composer的话,有一个包是挺好用的,就是GuzzleHttp。这个包的接口很简单,使用起来略微轻松。

下面是测试的代码:

<?php
require __DIR__."/vendor/autoload.php";

use GuzzleHttp\Client;

$client = new Client([
    "base_uri' => 'http://www.zeroplace.cn/',
    'timeout'  => 2.0,
]);

$res = $client->request("GET", "/");
echo $res->getStatusCode(), "\n";
foreach ($res->getHeaders() as $name => $values) {
    echo $name . ': ' . implode(', ', $values) . "\r\n";
}

$body = $res->getBody();
echo $body;

这个是测试代码的地址:https://github.com/gaohuia2015/test_guzzle

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 9854

git部分常用命令图示

 git是一个版本控制软件,在WEB应用开发中非常有用,这里就不多介绍了。

在git中对文件的修改往往会存在于三个“地方”: 工作区,暂存区和版本库。有一些命令使被修改的文件在这三者之间转移。有时经常会搞乱,所以我画了一个图来表示这些命令(下列所有的命令均为git命令)。

git命令图形化表示

用虚线表示的是文件的比较,用带箭头的实线表示的是文件的转移。

查看更多...

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 7158

粗用laravel5代码的感觉

 最近在网上看到大家对laravel的讨论比较多,所以我就下了一个laravel5.1(下面就简称为laravel5啦)的源码回来看了一下(大家用的比较多的应该不是5吧)。大致上看了一下结构什么的,没怎么往细了看。最后看了一下laravel5的官方文档,尝试性的写了一些代码。

结构

laravel5里面比较核心的应该有两个大的模块,一个是Application,一个是Kernel。

其实Application就是一个容器,加上一些对应用的配置,回调什么的。主要功能就是一个容器。他的这个思路有点类似于Java里面的Spring的容器。

查看更多...

Tags: php laravel

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 7203

百度链接提交主动推送ASP/PHP代码

链接推送是最为快速的提交提交链接的方式,百度建议您将站点当天新产出链接立即通过此方式推送给百度,以保证新链接可以及时被百度收录。

这里给出两段代码,分别用asp和php将您网站上新产生的链接推送给百度。

asp代码

sub noticeBaidu(article_url)
	dim http, url, body, responseText
	body = article_url
	url = "http://data.zz.baidu.com/urls?site=这里修改为你自己的网址&token=这里修改为你自己的推送KEY"
	set http=server.createobject("MSXML2.XMLHTTP")
	http.open "POST", url, false
	http.setRequestHeader "User-Agent", "request"
	http.setRequestHeader "Content-Type", "text/plain"

	http.send(body)
	" response.write(http.readystate)
	responseText = http.responseText
	response.write("notice response: " & responseText)
	set http = nothing
end sub

php代码

<?php
$urls = array(
    "http://www.zeroplace.cn/article.asp?id=960',
    'http://www.zeroplace.cn/article.asp?id=961',
);
$api = 'http://data.zz.baidu.com/urls
site=这里修改为你自己的网站&token=这里修改为你自己的推送KEY';
$ch = curl_init();
$options =  array(
    CURLOPT_URL => $api,
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => implode("\n", $urls),
    CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
);
curl_setopt_array($ch, $options);
$result = curl_exec($ch);
echo $result;

查看更多...

Tags: asp php seo

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 7784

yii2 rbac权限管理

Yii2是一个好的web开发框架, 其中也提供了对RBAC权限管理的支持。RBAC就是Role-Based Access Control(基于角色的访问控制)的简写,具体请看百度百科,http://baike.baidu.com/view/73432.htm

核心思想就是我把一系列的许可组合在一起,成为一个角色。第一个用户可以扮演多个角色,只要这多个角色中的其中一个角色可以做的事,此用户就可以做。

在Yii2中,RBAC模型如下图所示。

yii2 权限管理模型

查看更多...

Tags: yii rbac 权限

分类:PHP教程 | 固定链接 | 评论: 0 | 查看次数: 6357
博主QQ: 友情链接请找我
QQ群: 灰色档案
返回顶部 关闭