预览模式: 普通 | 列表

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 | 查看次数: 16745

array_unshift的性能问题

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

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

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

查看更多...

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

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

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

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

 

查看更多...

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

简单应对验证码接口恶意攻击

 这几天不断的有人攻击公司的验证码接口, 就是随机生成了一系列的手机号然后调用注册页面的验证码的接口. 对待这种攻击自然最严谨的是适时弹出验证码, 可临时我们没有这么快的速度去做这套验证码的方案(前面写了"适时"二字自然不能对所有人都弹出验证码, 本来用户转注册的转化率就低, 再加个验证码那就更难看了). 

今天又是周末, 只能简单处理一下.

我们的接口拉扯类似于

/api/smsCaptcha/send.json

注意到攻击者是用固定的几个IP来发起请求的, 此时最简单有效又不影响用户的方法自然是屏蔽攻击者的ip. 一个简单的指令就能让攻击者暴露无遗. 

tail -100000 /data/logs/nginx_access.log|grep smsC|awk "{print $1}'|sort |uniq -c|sort -n

查看更多...

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

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

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

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

开启error_reporting

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

error_reporting(E_ALL);

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

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

display_errors

查看更多...

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

GIT不要密码, GIT记住密码

我们在使用git的时候,经常会需要输入密码,比如git push, git fetch, git pul.这两个命令是非常常用的命令.每次输入这些命令都需要输入密码会是一件非常浪费时间的事.

如果能够让git记住密码就好了.也就是不需要输入密码.下面我们就来做这件事.

我们指定git远程仓库地址的时候,通常有两种方式:ssh方式和http方式.这两种方式记住密码的方式略有不同.

如何查看我们的远程仓库:

查看更多...

Tags: git

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

在Windows下执行Swoole

工作原因已经很久没有写博客了, 最近在研究swoole相关的东西, 又得空, 正好来写一篇. 没什么深度. 

最近在研究swoole, 偶尔需要写点测试代码来测试. 因为swoole不支持windows, 所以需要跑到linux下开个vim写. 总体来说, 还是没有windows下sublime+ctrlB来的爽. 所以想了个办法:

windows + sublime + docker(php+swoole)

说是Windows下执行swoole, 其实实际还是linux下执行swoole.

查看更多...

分类:win7技术 | 固定链接 | 评论: 0 | 查看次数: 107076

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

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

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

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

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

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

查看更多...

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

PHP BOM头导致COOKIE无法输出

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

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

 

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

查看更多...

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

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 | 查看次数: 140033

Windows版Docker体验

 不久前发现Docker可以原生支持Windows了(目前仅支持64位windows10),安装了一个来体验. 此前是需要搞一个Vbox跑虚拟机的.

获取地址: http://www.docker.com/products/overview

因为我开发一般需要用到lnmp环境, 就准备搞一个这样的容器. 没有用hub上面现成的镜像, 自己在centos6的镜像上派生了一个.  因为docker的网络是基于nat的, 所以也做了端口映射. 另外把本地的一个开发目录挂载到nginx的html目录. 这样基本上就算完工了.

虽然给容器指定了2G内存, 但实际上容器并不会像虚拟机一样把所有的内存事先分配掉. 所有的内存是共享的, 未分配的内存宿主机依然可以拿来做其它的用途. 这是容器明显优于虚拟机的地方.

查看更多...

分类:WEB服务器 | 固定链接 | 评论: 0 | 查看次数: 126563

贴吧自动删贴怎么办

 百度贴吧在百度系的产品里权重算是比较高的, 有时还可以给我们带来不少的流量. 但是当我们刚发完贴去看主题列表, 经常会发现没有我们刚发的帖子. 这种情况十有八九是被百度系统给删除了. 

百度贴吧有一套自动扫描系统, 新发的帖子都会经过这个系统的过滤. 但是实际上这个系统真的很傻B, 有时候正常发贴会被删, 发一些无意义的东西甚至广告却啥事没有.

实际上大小吧主看到我们发贴是很高兴的,基本上不太会随意删除. 我们主要要对付的就是百度的这套自动过滤系统.

好的, WEB应用开发网来教你怎么对付这套人工智能

查看更多...

分类:智慧人生 | 固定链接 | 评论: 0 | 查看次数: 134811

工欲善其事必先利其器, 没有良好的装备,怎么在各种微信群里面抢得到红包呢? 你有足够高端的手机, 也有足够快的网速, 还有一根灵敏的手指和一双敏锐的魔眼, 只能说你比较有优势,却未必就能在千军万马中抢到红包。你不可能每时每刻都盯着手机吧?你总得从裤兜里掏出手机, 再打开微信才能抢到吧?而在这个时候, 有的人, 就是在手机发出“叮咚”一声的时候,手机还在裤兜里就已经完成了抢红包。

完成自动抢红包需要一些软件, 但这些东西并不复杂,还都是免费的。网络上都可以找到。

查看更多...

分类:下载专区 | 固定链接 | 评论: 0 | 查看次数: 135330

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

## Part1

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

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

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

58同城访问过频繁验证码突破

 58同城数据还是挺多的,很多人可能需要通过抓取58同城的数据来作为第一批种子数据。这非常可行。但是如果你抓取的速度过于频繁,会出现下面这张页面。

 

对于出现这张页面之后可能就没有办法继续访问了,只有更换ip。

查看更多...

分类:网络安全 | 固定链接 | 评论: 0 | 查看次数: 79540

12306验证码识别接口

 准确率大概在90以上,速度不到0.5秒。纯机器识别,人机配合维护图片库。

需要的联系我QQ:593953978。 

查看更多...

分类:智慧人生 | 固定链接 | 评论: 0 | 查看次数: 59679

Windows安装64位NumPy和SciPy包

 到这个网站下载whl文件

http://www.lfd.uci.edu/~gohlke/pythonlibs/

注意下载和自己的python对应的版本

如何安装whl文件:

pip install whatever.whl
分类:python | 固定链接 | 评论: 0 | 查看次数: 73590

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 | 查看次数: 53422

腾讯云乱扣费 腾讯云账户欠费 

使用腾讯云产品的同学千万要注意了,使用之前一定要仔细阅读它们的用户使用协议,使用之前一定要仔细阅读它们的用户使用协议,使用之前一定要仔细阅读它们的用户使用协议,重要的话要说三遍,否则有一天你会发现你的房子,车子全归腾讯所有了。虽然我知道大多数人连看都不会看那协议一眼,由此可见腾讯是多么的无耻,阴险,利用广大善良同胞对互联网公司基本的信任赚钱。

下面我就把我遇到的情况写出来,血的教训啊。

首先公司需要做一个app需要乃至视频通话的功能(下面简称app)。我作为一个程序员呢在百度上找到了腾讯云的“音视频”。大家认为既然是腾讯的东西应该比较靠谱,那就试试。说干就干,我就去腾讯云创建了这么个应用。虽说我知道它是收费的,但我心想我账户里面一分钱都没有,先创建一个大不了不让我用咯。

查看更多...

分类:智慧人生 | 固定链接 | 评论: 0 | 查看次数: 56516

python用socket实现发送和接收一个http请求,自动处理gzip。直接上代码。

# -*- coding: utf-8 -*-

import zlib, socket

conn = socket.create_connection( ("www.zeroplace.cn", 80) );

data = "''GET / HTTP/1.1
Host: www.zeroplace.cn
Accept-Encoding: gzip, deflate
'''

print data

conn.send(data + "\r\n")

recv_data = ""
header = None
body = None
length = 0

headers = {}

buf = conn.recv(1024)

html = ""

while True:
	recv_data += buf
	
	if header is None:
		index = recv_data.find("\r\n\r\n")
		if index >= 0:
			header = recv_data[0:index];
			recv_data = recv_data[index+4:];
			header_lines = header.split("\r\n")
			status_line = header_lines[0]
			print status_line
			for line in header_lines[1:]:
				print line
				line = line.strip("\r\n")
				if len(line) == 0:
					continue
				colonIndex = line.find(":")
				fieldName = line[:colonIndex]
				fieldValue = line[colonIndex+1:].strip()
				headers[fieldName] = fieldValue

			# print headers
			length = int(headers['Content-Length'])

	if header is not None and len(recv_data) >= length:
		break;
	else:
		buf = conn.recv(1024)

if 'Content-Encoding' in headers and headers['Content-Encoding'] == 'gzip' :
	html = zlib.decompress(recv_data, 16+zlib.MAX_WBITS)
else:
	html = recv_data

print html

conn.close()
分类:python | 固定链接 | 评论: 0 | 查看次数: 51405
博主QQ: 友情链接请找我
QQ群: 灰色档案
返回顶部 关闭