PHP按特定key进行多维数组排序
这个排序在网上直接搜索的结果有这样一个:
array_multisort(array_column($array,'sort'),SORT_ASC,$array);
这个是错误的。 切忌不要以讹传讹了。
分析排查
实际上array_multisort 是PHP内置的方法,官方有说明: PHP - array_multisort
这个排序在网上直接搜索的结果有这样一个:
array_multisort(array_column($array,'sort'),SORT_ASC,$array);
这个是错误的。 切忌不要以讹传讹了。
实际上array_multisort 是PHP内置的方法,官方有说明: PHP - array_multisort
因为一些学习和研究目的,最近在写一些数据抓取的组件,在网页上很常见的是相对链接,有时候因为所在网页和相对链接的关系不太确定,所以就需要转换一下,本来这个功能实在太简单,直接在网上搜索了一下,但是发现绝大部分代码都是错的,或者说不严谨,随便改一个目录深度就会发生错误。 这里贴一下我的解决方案:
<?php
class spider{
/*
$rel string 相对链接
$baseURL string 当前所在页面完整地址
*/
public function absoluteURL( $rel, $baseURL ): string
{
// 忽略绝对地址
if ( strstr( $rel, 'https:/') || strstr($rel,'http:/') || strstr($rel,':/') ){
return $rel;
}
// 结构化当前URL
$url = parse_url($baseURL);
$rel = trim($rel);
$depthPath = [];
foreach ( explode('/',$url['path']) as $i => $p ){
if( $p != '' ){
$depthPath[] = $p;
}
}
$pathDeep = count($depthPath);
$relDepth = [];
$rootPath = false;
$backPathDepth = 0;
if( strstr($rel,'/') ){
foreach ( explode("/",$rel) as $i => $r){
if( $i==0 && $r == '' ){ // 直接根目录
$rootPath = true;
}
if( $r != '' ){
$relDepth[] = $r;
}
if( $r === '..' ){
$backPathDepth++;
}
}
}else{
$relDepth = [$rel];
}
$new_url = $url['scheme'] . '://' . $url['host'];
if( !$rootPath ){
for( $i = 0; $i < $pathDeep - $backPathDepth; $i++ ){
$new_url .= ('/' . $depthPath[$i]);
}
}
for ( $i = 0; $i < count($relDepth); $i ++ ){
if( $relDepth[$i] !== '..' && $relDepth[$i] !== '.' ){
$new_url .= ('/' . $relDepth[$i]);
}
}
return $new_url;
}
使用phpDocumentor可以快速根据规范的注释生成一整套接口文档,是进行php开发十分便利的工具。 有时候我们会在自己的框架内引入别的库,这个时候一键生成文档会导致将库文件一起分析,不仅速度很慢同时也会导致生成的文档出现不必要的内容。
可以使用 -i,-ignore 设定屏蔽文件夹的参数 可以参考官方文档:
-i|–ignore[”...”]
Provide a comma-seeparated list of paths to skip when parsing.
在使用phpar命令进行生成的时候,需要注意使用 --igonre 或 -i
参考如下:
sudo php /Library/WebServer/Documents/phpDoc/phpDocumentor.phar -d /Library/WebServer/Documents/appsite-new/server -t /Library/WebServer/Documents/docs/appsite-new/doc --ignore library/ custom/ demo.php
如果有多个目录,使用 and 进行分隔,单一文件使用完整文件名结尾,文件目录要以/
结尾。
旧版本官方文档 using.command-line.ignore
-i, --ignore
Use the -i option to exclude files and directories from parsing. The -i option recognizes the * and ? wildcards, like -f does. In addition, it is possible to ignore a subdirectory of any directory using "dirname/".
phpdoc -i tests/ will ignore /path/to/here/tests/* and /path/tests/*
phpdoc -i *.inc will ignore all .inc files
phpdoc -i *path/to/* will ignore /path/path/to/my/* as well as /path/to/*
phpdoc -i *test* will ignore /path/tests/* and /path/here/my_test.php
Since v1.3.2, the value or pattern you provide will be case-sensitive (OS permitting, anyway), and will be applied relative to the top-level directory in the -d argument.
phpdoc -i CVS/ will ignore /path/to/CVS/* but will not ignore /path/to/cvs
phpdoc -d /home/myhome/cvs/myproject -i cvs/ will ignore /home/myhome/cvs/myproject/files/cvs/* but will not ignore /home/myhome/cvs/*
最近正在做appsite框架传统网站架构的拓展、其中不免有SEO的部分。 在网上做了一点功课,meta中的 description比较关键,keywords据说已经不再受搜索引擎的关照了,不过这种事情现在不能盲目相信,既然做一个网站那么还是应该要照顾好关键词。但是没必要付出过高的人力成本,所以我这里想到的还是使用分词扩展来自动生成关键词。 这样做的好处是,无论搜索引擎是否在意关键词,我们有和内容相关度很高的关键词,这不会对我们带来损失。 基于程序算法生成的关键词,不需要我们花费人力成本,包括可以在后台控制是否开启该功能。
我这里选用的是对php支持比较好的 SCWS分词扩展。 如果分词的目的是更多的语义化分析、情感分析等,那还是应该考虑一下其他的分词库,不过基本上没有php支持。
进入正题
由于没有数据表的概念、我们很多基于关系型数据库的查询方式、在Redis服务器上就要有新的思路。 譬如说我们通过4张表来维护用户数据、在redis上就应该只使用一个Hash 另外类似于Comment这样的表,我们就需要设计成Redis List类型 以COMMET_USERID来作为key 每一次添加一条反序列化数据进去。但这样做面临的问题是我们无法使用关系型表的其他诸如合并查询、反向查询等查询功能。
配置文件中配置 requirepass yourpassword
目前没有方案 考虑中 这个部分也和java服务端的朋友讨论过,Redis确实没有这方面的支持,如果考虑同一个redis服务器中有多个或者大量Saas需求、那么比较好的方式就是在最前面加一个appid的索引。
探索一下几种实现方式:
# 以saasID作为key userid做其中一项的方式
hset TRFUnmsZ userid qFVqmqMz nickname sprite
hset gdYuSu4G userid hGE5REy2 nickname amber
# 以userid作为key saasid作为其中一项
hset qFVqmqMz saasid TRFUnmsZ nickname sprite
hset Lh8PCIVy saasid TRFUnmsZ nickname soki
hset gdYuSu4G saasid hGE5REy2 nickname amber
# 以saasid拼接 keyid的方式
hset TRFUnmsZ_qFVqmqMz nickname sprite
hset TRFUnmsZ_Lh8PCIVy nickname soki
hset hGE5REy2_gdYuSu4G nickname amber
hset TRFUnmsZ_SETTING WECHATID 123456
hset TRFUnmsZ_SETTING APPNAME AppSite
hset hGE5REy2_SETTING WECHATID 654321
基于Redis只能通过key进行查询、不能使用类似于MySQL的WHERE查询,所以用saasid作为key的方式被摒弃。我们不可能取出所有的saas下的数据 再到程序里查找。
在macOS上安装php-redis是比较简单的,但是也有可能进入坑里,由于百度到的结果更坑,所以整理一下备用
官方下载地址 https://redis.io/download 参考官方的说明、安装步骤是 手动下载或者使用终端wget下载tar包 下载完毕后解压并且打开目录
$ cd /User/sprite/Downloads/redis-5.0.5
$ make
安装完毕之后打开终端输入 redis-server 出现redis欢迎界面表示已经安装成功
使用redis-server启动redis服务之后不要关闭终端页面、测试的时候要另外打开一个终端、然后输入redis-cli 否则会报错 无法连接到redis服务器
大杀器 官方文档 phpredis-Github
参考官方的文档,我们可以采用pecl安装、我没有尝试。 使用编译安装的方式
https://github.com/phpredis/phpredis/releases
下载完毕后解压,建议把包转移到其他地方,防止后面清理下载文件夹清理掉。 比如说 我放到了 /Library/PhpExtra/redis-5.0.2 (可以随便放)
$ cd /Library/PhpExtra/redis-5.0.2/redis-5.0.2
一定要保证目录下有 configure文件
这一步是网上基本都错误的部分 phpize是一个可执行文件,路径一般在/usr/bin/下 如果我们的mac注册了php环境,那么我们直接输入phpize就可以 没有再切换目录的必要。
$ phpize ./configure --with-php-config=/usr/bin/php-config
如果这一步的时候,无法找到phpize我们再使用绝对路径来定位
$ /usr/bin/phpize ./configure --with-php-config=/usr/bin/php-config
可能发生的问题:
1.Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable.Then, rerun this script.
brew install autoconf
2.mac phpize执行后报错:grep: /usr/include/php/main/php.h: No such file or directory
3.make: *** No targets specified and no makefile found.
如果phpize这一步成功了,不报错了。仍然有可能无法安装。比如说我就是这样。
无奈,尝试使用pecl方式安装。
一番折腾。 发现还是搞不定。 最终发现了是自己在2.3的步骤时候有错误。
$ cd /Library/PhpExtra/redis-5.0.2/redis-5.0.2 # 切换到你解压的目录
$ phpize
Configuring for: PHP Api Version: 20160303 Zend Module Api No: 20160303 Zend Extension Api No: 320160303
这一步看不到版本号的,看上面错误参考2
$ ./configure
... configure: creating ./config.status config.status: creating config.h
$ make
... Build complete. Don't forget to run 'make test'.
$ make install
...
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20160303/
最后一步会告诉你 扩展安装到了哪里,复制下来 去php的配置文件中添加
php.ini一般在 /etc/php.ini 如果你没有就复制一个 php.ini.default出来 最后加上:
extension_dir="/usr/lib/php/extensions/no-debug-non-zts-20160303"
extension=redis.so
保存重启apache
sudo apachectl restart
最近回复