如果让 strpos 查找一个整数类型的数字会发生什么?

18 Jan 2019 Category: php

每次数据来了,想要查找这个字符串中某个字符,上来就是使用strpos。strpos用于查找字符串中某个子串第一次出现的位置。

那么,如果不小心给strpos传入的是一个整数类型又会怎么样呢?

假设有一个字符串”I don’t happy ! xxxx585xxx”,现在需要把585以及后面的全部去掉。585是文件,或者数据库读取出来的,且做了数字类型格式化。

$str = "I don't happy ! xxxx585xxx";
$find = 585;
$s = substr($str, 0,strpos($str, $find));
var_dump($s);

直接使用strpop($str,$find);获取字符串的起始位置,然后再使用substr做一个截取。看似没有错误,但实际上跑完之后却是把整个字符串都删掉了。上面得到的是一个空字符串

查看更多

最简单的php trim函数并不简单

16 Jan 2019 Category: php

字符串的处理在任何程序中应该是最最常见的了吧。php 的trim函数就是用来去除字符串的字符串。最常用的就是去除空格了。但是,这个简单的函数,是否真的像你认为的那样简单呢?

trim函数的定义如下:


trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] ) : string

trim是两边去除,还有ltrim 从左边去除,rtrim从右边去除,在php源码中,最终都是通过一个函数处理的。所以一下关于trim是对php 内部统一的trim而言。

源码在ext/standard/string.c中php_trim函数中。

trim函数处理逻辑:

  • 判断是否设置去除内容what,没设置则去除默认字符串
  • 判断去除内容的长度,分为1个字符,多个字符去除
  • 使用model分别与1,2按位与运算,确定是否进行左右去除

查看更多

PHP赋值的内部原理

12 Jan 2019 Category: php

在PHP中,一个变量被赋值,内部到底经历了怎样的逻辑判断呢?

PHP在内核中是通过zval这个结构体来存储变量的,它的定义在Zend/zend.h文件里

struct _zval_struct {
    zvalue_value value; /* 变量的值 */
    zend_uint refcount__gc;
    zend_uchar type;    /* 变量当前的数据类型 */
    zend_uchar is_ref__gc;
};
typedef struct _zval_struct zval;

//在Zend/zend_types.h里定义的:
typedef unsigned int zend_uint;
typedef unsigned char zend_uchar;

使用xdebug的xdebug_debug_zval函数可以打印出变量的refcount,is_ref的值。

$a = 'Hello World';
$b = $a;

以上内容在内核中怎么执行呢?

    zval *helloval;
    MAKE_STD_ZVAL(helloval);
    ZVAL_STRING(helloval, "Hello World", 1);
    zend_hash_add(EG(active_symbol_table), "a", sizeof("a"),&helloval, sizeof(zval*), NULL);
    ZVAL_ADDREF(helloval); //这句很特殊,我们显式的增加了helloval结构体的refcount
    zend_hash_add(EG(active_symbol_table), "b", sizeof("b"),&helloval, sizeof(zval*), NULL);

可以看出来,当变量赋值的时候,其实两个变量指向的是同一个地址空间。那么问题来了,如果指向同一个地址空间,那不是修改a,b也会跟着改变。这就涉及php的写时复制机制。 以上代码,如果后面一行为$b = '123'判断过程如下:

  • 如果这个变量的zval部分的refcount小于2,代表没有别的变量在用,则直接修改这个值
  • 否则,复制一份zval 的值,减少原zval的refcount的值,初始化新的zval的refcount,修改新复制的zval

查看更多

大黄蜂好看吗?用python分析电影观看数据

11 Jan 2019 Category: php

大黄蜂,2019-01-04 在大陆上映。观众们很期待。但是期待归期待,是否真的值得去电影院观看还是值得商榷的。本片导演 特拉维斯·奈特 主演:海莉·斯坦菲尔德,约翰·塞纳,小豪尔赫·兰登伯格 目前在猫眼电影中评分:9.20,评价人数:129402人。看数据还是值得瞧一瞧。

猫眼电影目前m端有些数据还是直接返回json数据,所以抓取还是很方便。之前看网络上有一个分析海王电影的文章,但是一直没有找到代码,所以自己写了一个。不仅仅支持一个电影,可以对猫眼电影里的所有电影进行分析,前提是能爬下来数据。实验过程中,都是爬取10个电影就无法拿到数据了。

查看更多

你所不知道的php json解析

02 Jan 2019 Category: php

json解析在php,或者说在任何编程语言中都非常常见。但是,你是否知道,json解析在php中是以扩展形式存在。

json处理,最常用的就是json_encode,json_decode。

string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )

json_encode接受三个参数,但是一般的,我们都是使用一个参数,顶多会使用第二个参数,设置中文不转义,那其他的还有什么呢。

选项 说明
JSON_FORCE_OBJECT 使一个非关联数组输出一个类(Object)而非数组。
JSON_NUMERIC_CHECK 将所有数字字符串编码成数字
JSON_UNESCAPED_UNICODE 以字面编码多字节 Unicode 字符(不使用\u形式编码)
JSON_PRETTY_PRINT 用空白字符格式化返回的数据

json_encode多个选项使用的是多个选项进行或运算得到。json_encode($value,JSON_FORCE_OBJECT|JSON_NUMERIC_CHECK|JSON_UNESCAPED_UNICODE)表示如果空的时候,返回对象。数字返回数字类型,不编码。

查看更多

windows python scrapy 安装

29 Dec 2018 Category: php

scrapy 依赖三个包,wheel,lxml,twisted。其中wheel 可以直接使用pip安装。其他两个需要vc编译工具。谁也不许因为装个10M不到的包去下好几个G的编译工具,因此需要去找编译之后的whl包,进行离线安装。

lxml.whl包比较容易找,https://pythonwheels.com/ 这个网站上能够找到。

twisted.whl 比较费劲,网上给出的地址只有这个 https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted ,但是这个下载地址已经是404了。经过多次查询,找到一个win64-py37的版本。

依赖包下载完之后,分别执行以下内容即可完成安装

pip install wheel
pip install lxml.whl
pip install twisted.whl
pip install scrapy

查看更多

shpinx的安装使用

29 Dec 2018 Category: php

Sphinx 在2018年的搜索引擎中排名第五,但它仍然是一种强大且流行的技术,在排名方面让位于Elasticsearch和Solr。 Sphinx用于如此着名的系统中 Joomla.org, CouchSurfing.org, Wikimapia.org, Tumblr.com, 优酷土豆 以及数百种其他应用。

Sphinx支持高速建立索引(可达10MB/秒,而Lucene建立索引的速度是1.8MB/秒) 高性能搜索(在2-4 GB的文本上搜索,平均0.1秒内获得结果) 高扩展性(实测最高可对100GB的文本建立索引,单一索引可包含1亿条记录) 支持分布式检索 支持基于短语和基于统计的复合结果排序机制 支持任意数量的文件字段(数值属性或全文检索属性) 支持不同的搜索模式(“完全匹配”,“短语匹配”和“任一匹配”) 支持作为Mysql的存储引擎

查看更多

用sphinx给PHP加个给力的搜索功能

28 Dec 2018 Category: php

最近工作上需要实现搜索功能,尝试了几种方案。虽然最终线上部署的还是最low的方案,但是中间的过程还是比较有意思的。业务上根据关键字查找内容。关键字的出处多来源于标题,文章描述等。主要实现方式有一些几种,各个方式各有利弊,需要权衡。

like模糊查询标题和描述,使用或条件查询

like查询估计是最常用的方式了,也是最容易实现的方式。业务代码少,逻辑清晰,准确率也高。不用其他额外操作(比如分词)。但是有个非常致命的问题,那就是效率。效率非常低,特别是在数据量大的情况。测试过程中,在224256行数据中,对3749个字进行like查询,执行总时间长达4003秒。相当于每个查询需要花费1.06秒的查询时间。

查看更多