验证器:
https://www.bookstack.cn/read/easyswoole-3.x-zh/Components-validate.md
App/HttpController/Index.php



App/HttpController/BaseController.php



统一验证:
class Index  extends BaseController
{
    function index()
    {
        $this->response()->write("123");
    }

  /**
     * 验证
     *
     * {@inheritdoc}
     * @see \App\HttpController\Index\Index::validateRule()
     */
    protected function validateRule(?string $action): ?Validate
    {
        $v = new Validate();
        $params = $this->request()->getRequestParam();
        echo "Here:\n";
        var_dump($action);
        switch ($action) {
            case 'index':
                {
                    $v->addColumn('title', '竞赛标题')
                        ->required('不能为空')
                        ->notEmpty();
                    $v->addColumn('limit', '每页条数')
                        ->integer();
                    $v->addColumn('page', '当前页码')
                        ->integer();
                    if (isset($params['recommend_status'])) {
                        $v->addColumn('recommend_status', '推荐状态')->integer();
                    }
                    if (isset($params['act_status'])) {
                        $v->addColumn('act_status', '活动状态')->integer();
                    }
                    break;
                }
            case 'searchActivity':
                {
                    $v->addColumn('title', '竞赛标题')
                        ->required('不能为空')
                        ->notEmpty();
                    $v->addColumn('limit', '每页条数')
                        ->integer();
                    $v->addColumn('page', '当前页码')
                        ->integer();
                    if (isset($params['recommend_status'])) {
                        $v->addColumn('recommend_status', '推荐状态')->integer();
                    }
                    if (isset($params['act_status'])) {
                        $v->addColumn('act_status', '活动状态')->integer();
                    }
                    break;
                }
            case 'getRobotAnswer':
                {
                    $v->addColumn('topic_id', '题目id')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('score', '积分')
                        ->integer();
                    break;
                }
            case 'saveActivity':
                {
                    $v->addColumn('title', '竞赛标题')
                        ->required('不能为空')
                        ->notEmpty();
                    $v->addColumn('type', '展示模式')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('description', '竞赛描述')
                        ->required('不能为空')
                        ->notEmpty();
                    $v->addColumn('start_time', '开始时间')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('end_time', '结束时间')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('paper_status', '试卷状态')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('act_status', '活动状态')
                        ->required('不能为空')
                        ->integer();
                    if (isset($params['act_id'])) {
                        $v->addColumn('act_id', '竞赛id')->integer();
                    }
                    if (isset($params['recommend_status'])) {
                        $v->addColumn('recommend_status', '推荐状态')->integer();
                    }
                    if (isset($params['recommend_index'])) {
                        $v->addColumn('recommend_index', '推荐序号')->integer();
                    }
                    break;
                }
            case 'delActivity':
                {
                    $v->addColumn('act_id', '竞赛id')
                        ->required('不能为空')
                        ->integer()
                        ->min(0);
                    break;
                }
            case 'getActivity':
                {
                    $v->addColumn('act_id', '竞赛id')
                        ->required('不能为空')
                        ->integer();
                    break;
                }
            case 'getActivityList':
                {
                    $v->addColumn('recommend_status', '推荐状态')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('limit', '列表数')
                        ->required('不能为空')
                        ->integer();
                    break;
                }
            case 'getPaper':
                {
                    $v->addColumn('act_id', '竞赛id')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('paper_nums', '试卷题量')
                        ->required('不能为空')
                        ->integer();
                    break;
                }
            case 'addPaperTopic':
                {
                    $v->addColumn('act_id', '竞赛id')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('topic_id', '题目id')
                        ->required('不能为空')
                        ->notEmpty();
                    $v->addColumn('topic_title', '题目标题')
                        ->required('不能为空')
                        ->notEmpty();
                    $v->addColumn('topic_label', '题目标签')
                        ->required('不能为空')
                        ->notEmpty();
                    break;
                }
            case 'delPaperTopic':
                {
                    $v->addColumn('act_id', '竞赛id')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('topic_id', '题目id')
                        ->required('不能为空')
                        ->notEmpty();
                    break;
                }
            case 'updatePaper':
                {
                    $v->addColumn('act_id', '竞赛id')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('type', '答题类型')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('nums', '题量')
                        ->required('不能为空')
                        ->integer();
                    break;
                }
            case 'updateScoreSet':
                {
                    $v->addColumn('per_score', '答对得分')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('win_score', '获胜得分')
                        ->required('不能为空')
                        ->integer();
                    $v->addColumn('fail_score', '失败得分')
                        ->required('不能为空')
                        ->integer();
                    break;
                }
        }
        return $v;
    }


App/HttpController/BaseController.php
这是老式编程语bai言里的标签跳转, 相当于C语言du里面的goto语句
可以实现 分支选择zhi, 循环等功能
sed '/^AA/ba;s/$/ NO/;b;:a;s/$/ YES/' 解读如下dao
sed是逐行扫描的
/^AA/ba;s/$/ NO/ 意思是如果当前行句首是AA
则跳转到标签a,执行s/$/ YES/ 即在行末插入YES (这里使用替换s命令实现插入)
否则执行s/$/ NO/, 在行末插入NO
对所有行都执行这种操作, 大功告成




echo 1 2 3 4 5 6 7 8 9 10 | perl -p -e 's#(\d+) #\1\n#g' | sort -n -k 1 | sed -e :a -e '$d;N;2,3ba' -e 'P;D'

3ba表示去掉最后3行,你要保留最新的5个,那就是5ba好了


sed -n '/^Handle/{:a;N;/\n$/!{$!ba};s/.*Range Size: \([^\n]*\).*/\1/p}' file
[解析]
文本就3个段落,2个空行为分割,用sed首先想到肯定是以空行为分割,把一整段文本读取在一起,然后统一进行匹配和替换,特别注意N读取内容匹配空行是 /\n$/ ,而不是一般的 /^$/  ,另一个问题是到了尾行因为没有下面的空行来激活,所以我们要在前面加个尾行的匹配跳转。这样就可以成功替换以Handle开头的段落内容,如果没匹配到也当然不会打印。


sed -n 'H;/^$/!{$!b};x;s/\nHandle.*Range Size: \([^\n]*\).*/\1/p' file
[解析]
因为是以空行为分割,H 追加到 hold space ,后面的替换只对空行或者最后一行才执行,否则都会跳过,也只有符合关键字的才会被替换打印。其他的行则因为 -n 的原因不会被输出。


From:https://blog.csdn.net/woshizhangliang999/article/details/53379158
从Macbook通过iTerm2的SSH连接到其它linux实现iTerm2远程pbcopy,前几周我也想过,但是不知怎么实现,
前两天鸟哥在其微信朋友圈里贴了一个PHP版本的实现思路,我这实践了一下,用Go语言实现了使用起来顺手,

于是在想,可能很多人都有这个需求,于是写下我的实现过程,拿走不谢,PHP是最好的语言没有之一,如下:


使用OSC52实现iTerm2远程pbcopy实现模仿Mac的pbcopy的拷贝最基础原理如下:


关于PHP实现的鸟哥版本pbcopy的详细情况见如下链接:
https://mp.weixin.qq.com/s/-aFTI32LWCJG_7aEuCUBgw


现在,开启swoole顾问的GO实现正文:
上面是摘录来自鸟哥的文章,他是用PHP实现了的,但是PHP不是每台机器都有且没有PHP怎么办呢?
于是用Go歪歪斜斜的写了一个,以力求实现功能就算是很OK了,实践发现果然OK的,有鸟哥加持嘛!

pbcopy.go


在MacBook上面编译成Linux上可运行的pbcopy,如不这样会报-bash: ./pbcopy: 无法执行二进制文件错:
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o pbcopy pbcopy.go


从MAC机上编译成功后把上面的二进制GO文件扔到CentOS的服务器上,修改iTerm2连接远程机器设置,

点击在新窗口中浏览此图片

运行,就成功复制到Mac的剪切板上了,注意一定是用iTerm2软件下ssh连接远程服务器,不是在secureCRT:
echo "osc520 codes" | /home/xiangdong/bin/pbcopy


最后,就是把/home/xiangdong/bin/pbcopy 加到那个Linux 的环境PATH变量里了,如下:
chmod +x ~/bin/pbcopy

vim  ~/.bashrc      #/home/xiangdong/.bashrc 把这个pbcopy路径加到PATH环境变量里面去,下次不用再输入绝对路径了。
export PATH=/home/xiangdong/bin:$PATH


$tree  ~+/bin/
/home/xiangdong/bin/
├── kubeladder
└── pbcopy


就可直接运行pbcopy了,不用加点了:
echo "osc520 codes" |pbcopy

最后,
鸟哥微信朋友圈问了一喙,这个能否在secureCRT里也支持一下呢,可不就可以批量部署到控制机上,拷贝操作更完美了。

目前在secreCRT里运行输出如下:
$echo "osc540 codes" |pbcopy
;;b3NjNTQwIGNvZGVz


乔大妈给了一个纯shell的白膘(月票)版本:
cat  ~/.bashrc
alias pbcopy2="(printf '\033]1337;CopyToClipboard=\7'; cat -; printf '\033]1337;EndCopy\7')"

echo "osc520 codes" |pbcopy2
osc520 codes
osc52000 codes
Shell 也可以包含外部脚本, 可以封装一些公共的代码为单独文件,需要用的时候直接引用。
方法有两种, 分别是.和source, 如下:
1)我看在centos6.X里面的/etc/init.d/nginx就是用的点空格引入的。



2)无论是source还是点空格最好是用绝对路径:
放在同一个目录下,所以source ./import.sh 引用看起来没有问题, 但是如果在上一层目录运行脚本时会出错,如下:
$ sh shell_testing/test.sh
shell_testing/test.sh: line 4: ./import.sh: No such file or directory
实践如下,相当于shell去包含./import.sh是从运行目录去包含的,去了上层目录就认为./import.sh是在上一层目录下面,所以得用绝对路径:


所以引用的话最好使用绝对路径, 其实也就是test.sh脚本的绝对路径,因为这两个脚本放在同一个目录下。
import.sh


test.sh


$./test.sh
LiLei
EOF
Your name is LiLei

注意:
1.两个点之间,有空格,千万注意.
2.两个脚本不在同一目录,要用绝对路径
3.为简单起见,通常用第一种方法

摘自链接:https://www.jianshu.com/p/cc4dda1fb77f


在两个机房里这两个VIP下面有很多的服务,如果用ansible一次性给干死了,但是这个java的进程要启动得15秒,也就出现了集体同时在启动中,没有对外服务,怎么办?只有先后启动,这时就有用了,两个机房的一些机器15秒后启动,一些机器立即启动,错开启动的好处是,两个机房能同时对外提供服务:
/data/www/ai.xxx.xxxx.com/server/start.sh



/data/www/ai.xxx.xxxx.com/server/stop.sh


延后启动的shell文件引用:
/data/www/ai.xxx.xxxx.com/bin/delayRestart.sh


直接启动的shell文件无 sleep 15:



还是相对路径问题,得修改这个jar包路径为绝对路径:
/data/www/ai.xxx.xxxx.com/bin/output.log
Error: Unable to access jarfile eladmin-system-3.1.jar


实践成功部署如下:
ansible ai_web -a'ps -eo pid,lstart,etime,cmd | grep eladmin-system|grep -v grep'  
10.73.234.136 | CHANGED | rc=0 >>  
24238 Thu May 21 14:21:03 2020       02:28 java -jar -Xms1024m -Xmx4096m -XX:MetaspaceSize=1024M -XX:MaxMetaspaceSize=4096m /data/www/ai.xxx.xxxx.com/server/eladmin-system-3.1.jar --spring.profiles.active=prod  
10.73.234.137 | CHANGED | rc=0 >>  
34282 Thu May 21 14:21:19 2020       02:12 java -jar -Xms1024m -Xmx4096m -XX:MetaspaceSize=1024M -XX:MaxMetaspaceSize=4096m /data/www/ai.xxx.xxxx.com/server/eladmin-system-3.1.jar --spring.profiles.active=prod  
10.169.70.72 | CHANGED | rc=0 >>  
52665 Thu May 21 14:21:19 2020       02:12 java -jar -Xms1024m -Xmx4096m -XX:MetaspaceSize=1024M -XX:MaxMetaspaceSize=4096m /data/www/ai.xxx.xxxx.com/server/eladmin-system-3.1.jar --spring.profiles.active=prod  
10.169.70.71 | CHANGED | rc=0 >>  
31033 Thu May 21 14:21:04 2020       02:27 java -jar -Xms1024m -Xmx4096m -XX:MetaspaceSize=1024M -XX:MaxMetaspaceSize=4096m /data/www/ai.xxx.xxxx.com/server/eladmin-system-3.1.jar --spring.profiles.active=prod  
大牛微信群札记,Mark下,应该有点干货,作下简单记录,那么年轻就被封神,
所以,出名还得趁早,可能和国外的计算机文化水平有关,有的娃估计三岁就学计算机,所以,我们还是要学先进啊,搞不定就靠下一代奋起直追吧,以下是顾问觉得有点意义的摘选:

之前rango兄弟做swoole开源项目 7-8年,现在也干不过年轻人了。

据说新一代的程序员,写出来的代码更有艺术气息。

像rango这样的大牛写的代码,都被年轻的开发者鄙视了,被吐槽多了,逐渐不写了。


下面这位是大神,年轻的大神:
php parser(https://github.com/nikic/PHP-Parser)原来就是这个年轻人搞的啊 厉害
这个得编译原理扎实才行,LLVM 作者,PHP7 作者,不像我们将就德国小伙,很严谨的。



现在都用 php -S 了,比 node 、golang 的 httpserver 要更易用。生产环境用 php-fpm + nginx ,现在 PHP7 很稳定。
以前 php 5.3 还有 coredump,php72 之后基本上没遇见。现在年轻人更进一步,全用 docker 了,不是docker替代fpm
docker pull 下载 php nginx fpm 还有一大堆扩展,然后 docker run 直接运行,零配置
像lvs 20年前老古董了,现在都不用这个。有更先进的 slb 软件,时光真TM快,真老了,不服不行,隔几年只扶墙了。


当前,可选的技术 太多了。php 的优势没那么明显,劣势又凸显出来。
Java 里面 spring boot, spring cloud 开发效率大大提升,以前 EJB、XML 那时代,Java 用起来很麻烦。现在又多了 Node.js、Golang 有异步 IO 、协程的特色功能。PHP 没什么亮点,缺点还挺多

有兄弟在富途推swoole:在富途推swoole,各种被老板们挑战,觉得出了问题,大部分人搞不定,所以迟迟推不动。

一阵讨论,还得把这个革新PHP的重任给年轻的大神,充满期待:
虽然能搞个 swoole 的扩展,但是也没有能力去改造 php ,这得依赖 Nikic 这样的计算机大神了。

rango兄弟的视界:
PHP 需要改造 VM 、标准库,第一 必须加入 JIT ,否则偏运算或者逻辑重的服务,性能不行。当然 VM 如果能内置 协程、多线程、异步 IO 会比较好。 第二 标准库太随意了,得好好设计一下,标准库根本没有 namespace ,太乱了。 Java、C++、Go、Node.js 标准库很规范的。PHP 语言不改变,可能逐渐就被时代抛弃了。

去年尝试了基于k8s / istio / grpc来做架构和业务
对比以前写PHP,真的太舒服了
下半年带我们团队转型golang了--2020/3/10 14:06


Go会不会是另一个强有力的挑战者?
golang 现在有点难用,没泛型。等 Golang 2 吧



年轻大神文章,学习下英语之用:https://nikic.github.io/2020/05/10/Make-LLVM-fast-again.html



About Me
Hi! My name is Nikita Popov, but you’ll mostly meet me as nikic on the internet. I’m working as a software developer at JetBrains on the PhpStorm team. Before that, I studied computer science and physics at the Technical University of Berlin. I contribute to the PHP and LLVM projects and maintain a number of open-source PHP libraries.

Feel free to contact me via nikic@php.net. Alternatively you can usually find me in the PHP chatroom on StackOverflow.

Projects
My most popular open-source projects, sorted by stars:

PHP-Parser – A PHP parser written in PHP
FastRoute – Fast request router for PHP
scalar_objects – Extension that adds support for method calls on primitive types in PHP
iter – Iteration primitives using generators
php-ast – Extension exposing PHP 7 abstract syntax tree
PHP-Fuzzer – A fuzzer for PHP libraries
Accepted PHP proposals
PHP 8.0:

自我介绍:https://nikic.github.io/aboutMe.html
官网:https://www.kancloud.cn/willseecloud/ansible/1458190


有group 写成一行YAML对方括号报错,如下:



写成多行也就Ok了,如下:


asp bc_web.yml -C -D
PHP框架的目的: 区割代码 管理逻辑 降低成本 达成共识 片段冶理 防冶腐败 降低耦合 协同开发 默契达成 抵御安全
Atom扩展: https://github.com/liexusong/atom

git clone https://github.com/liexusong/atom.git
cd atom/
phpize
./configure
make && make install

cp -rf  /usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/atom.so /usr/local/php/ext/.

cat /usr/local/php/etc/php.d/atom.ini
extension=atom.so
[atom]
atom.datacenter = integer
atom.worker = integer
atom.twepoch = uint64




#php atom.php
540899828998078464
2020-02-01 14:22:48

能反解。

来自:https://mp.weixin.qq.com/s/bagOgzdwLyZv_ITNVnYfoQ?
最开始编辑器是用的sublime的,后来因为phpstome的强大功能换用的phpstome,但带的主题实在看不惯,就有了这片文章。

闲话少说,开始正文。

一、先要下载Monokai-Sublime主题文件,如下网盘链接。
https://pan.baidu.com/s/1jPDYISHdQmwSkdoRmOSbAQ

PhpStorm ,找到 file,setting,Color Scheme(快捷键 Ctrl+Alt+S)
Import Scheme。。。导入:Monokai_Sublime.icls,选:Monokai-Sublime Copy。



MacOS系统上,JetBrains诸如PhpStorm、IntelliJ IDEA、PyCharm等各种IDE在编辑器上默认不显示横向滚动条。当设置的字体比较大,需要向右滑动时很可能因为没有横向滚动条而大为恼火。

解决方法有两个:

滚动条受系统全局设置影响,因此我们可以设置总是显示滚动条。操作方法如下:打开系统设置-》通用,“显示滚动条”选项选“始终”;
滚动鼠标滑轮时按shift,此时是滚动横向滚动条。
注意::IDE中的"wrap on typing"指的是超过多少个字符自动换行,与横向滚动条不冲突。例如设置大号字体,60个字符横向显示不了,故而需要滚动条;但此时一行未超过80(或120)个字符,不会自动换行。
PHP旧版本,我这编译php55/   php56/   php7/   php71/  php72/ 都没有出现这个问题,php73出现了这个问题。


configure: error: Please reinstall the libzip distribution
rpm -ql libzip-devel|grep -v man
/usr/include/zip.h
/usr/include/zipconf-64.h
/usr/include/zipconf.h
/usr/lib64/libzip
/usr/lib64/libzip.so
/usr/lib64/libzip/include
/usr/lib64/libzip/include/zipconf.h
/usr/lib64/pkgconfig/libzip.pc
出现:
configure: error: Please reinstall the libzip distribution

于是:
yum install -y libzip-devel

编译PHP时出现新问题:
checking for libzip... configure: error: system libzip must be upgraded to version >= 0.11
error: Bad exit status from /root/rpmbuild/tmp/rpm-tmp.gsrSs0 (%build)
经过源码安装是最新的版本,解决办法:


再重新编译PHP7.3,后终于成功完成编译。


cat /usr/local/lib/pkgconfig/libzip.pc


find /usr/local/include/ -name "zip.h"
/usr/local/include/zip.h

rpm -qf /usr/local/include/zip.h
file /usr/local/include/zip.h is not owned by any package

rpm -qf /usr/local/include/zipconf.h
file /usr/local/include/zipconf.h is not owned by any package


ldd /usr/local/php/bin/php |grep libzip   #php 7.3.12
        libzip.so.5 => /usr/local/lib/libzip.so.5 (0x00007f3be1b38000)

旧的php,PHP 7.1.6,无任何返回:ldd /usr/local/php/bin/php |grep libzip


以上实践摘取自 :https://www.php.cn/php-weizijiaocheng-414091.html
https://blog.csdn.net/liuyeluoqing/article/details/81697954
https://blog.qzze.com/820.html


CentOS6.X上rpmbuild  -ba memcache-php73-4.0.5.el6.x86_64.spec
出现error: Autoconf version 2.64 or higher is required  :
https://blog.51cto.com/11736068/2110670
type用法,查找对应命令的返回值:
type cwww
cwww is an alias for cd /data/www/

k8s里的shell代码运行:


函数检测:

有一个n位数,它的各位数字翻转以后组成新的n位数,原来的n位数是新n位数的n倍,求所有可能的n位数。
如:
8712/4 = 2,178


鸟哥的代码:

#make calcnumber
cc     calcnumber.c   -o calcnumber

#./calcnumber
0 = 0 / 1
1 = 1 / 1
2 = 2 / 1
3 = 3 / 1
4 = 4 / 1
5 = 5 / 1
6 = 6 / 1
7 = 7 / 1
8 = 8 / 1
9 = 9 / 1
2178 = 8712 / 4
108901089 = 980109801 / 9
109999989 = 989999901 / 9


http://live.aulddays.com/tech/11/linux-shell-too-great-base-error.htm


我用shell写了一个:
#cat *.sh
#!/bin/bash
for i in {1000..9999} ;do
    rev=$(echo $i | rev)
    div=$(echo "$rev/4" | bc)
    if [[ "10#$i" -eq "10#$div" ]];then
      echo "result="$i;
    fi
done

sh calcnumber.sh
result=1997  #这个是小数四舍五入后相等的,shell在处理小数这方面有些弱,得靠BC。
result=2178
xargs的作用在于,大多数命令(比如rm、mkdir、ls)与管道一起使用时,都需要xargs将标准输入转为命令行参数。
echo "one two three" | xargs mkdir
上面的代码等同于mkdir one two three。如果不加xargs就会报错,提示mkdir缺少操作参数。

一)xrags删文件提示确认:
使用xargs命令以后,由于存在转换参数过程,有时需要确认一下到底执行的是什么命令。
-p参数打印出要执行的命令,询问用户是否要执行。

echo 'one two three' | xargs -p rm -rf
rm -rf one two three ?...y
上面的命令执行以后,会打印出最终要执行的命令,让用户确认。用户输入y以后(大小写皆可),才会真正执行。

-t参数则是打印出最终要执行的命令,然后直接执行,不需要用户确认。
echo 'one two three' | xargs -t rm -rf



二)文本里的多行目录名建立成文件夹:
如果xargs要将命令行参数传给多个命令,可以使用-I参数。

-I指定每一项命令行参数的替代字符串。
$ cat foo.txt
one
two
three

$ cat foo.txt | xargs -I file sh -c 'echo file; mkdir file'
one
two
three

$ ls
one two three
上面代码中,foo.txt是一个三行的文本文件。我们希望对每一项命令行参数,执行两个命令(echo和mkdir),使用-I file表示file是命令行参数的替代字符串。执行命令时,具体的参数会替代掉echo file; mkdir file里面的两个file。


来自:http://www.ruanyifeng.com/blog/2019/08/xargs-tutorial.html
利用 Redis 事务特征
redis 事务是原子操作,可以保证订单处理的过程中数据没有被其它并发的进程修改。
示例代码:

使用 ab 测试
$ ab -t 20 -c 10 http://192.168.1.104:9509/

经测试结果对比,redis 事务方式优于文件排他锁方式,而文件排他锁方式中,非阻塞模式优于阻塞模式。

更多,来自:https://199508.com/post/2054


echo strrpos("jack.txt",".");
4

如果你有一个文件名,你需要从PHP中删除扩展名(extension),有很多方法可以做到这一点。这里有三种方法。

使用pathinfo()函数

pathinfo()函数返回一个包含dirname,basename,extension和filename的数组。或者,您可以传递一个PATHINFO_常量,并返回完整文件名的那一部分:

$filename ='filename.html';
$without_extension = pathinfo($filename, PATHINFO_FILENAME);
如果文件名包含完整路径,则仅返回不带扩展名的文件名。


使用basename()函数

如果扩展名是已知的并且对于所有文件名是相同的,则可以将第二个可选参数传递给basename()以告诉它从文件名中删除该扩展名:

$filename ='filename.html';
$without_extension = basename($filename,'.html');
如果文件名包含完整路径,则仅返回不带扩展名的文件名。

使用substr和strrpos

$filename ='filename.html';
$without_extension = substr($filename, 0, strrpos($filename, "."));
如果文件名包含完整路径,则返回没有扩展名的完整路径和文件名。您可以使用basename()来删除路径,例如:

basename(substr($filename, 0, strrpos($filename, ".")));
尽管它比使用pathinfo慢。

速度比较

使用PHP 5.4在Mac上以10,000,000次循环运行其中的每一个:

pathinfo:10.13秒
basename:7.87秒
substr / strrpos:6.05秒
basename(substr / strrpos):11.98秒
如果文件名不包含完整路径,或者如果它不重要,那么substr / strrpos选项似乎是最快的。

如果文件名包含路径并且您不想要路径但确实知道要删除的扩展名是什么,那么basename似乎是最快的。

如果文件名包含路径,则不需要路径,也不知道扩展名是什么,那么使用pathinfo()选项。

结论

还有很多其他方法可以做到这一点,有些可能会更快。在很多情况下,速度可能并不那么重要(运行pathinfo的10秒钟毕竟是10万次)。这篇文章的目的是展示一些用PHP从文件名中删除扩展名的方法。


来自:http://www.webkaka.com/tutorial/php/2019/050857/
路径含有空格导致误删文件
史上最经典的要数下面这个bumblebee项目了,这个项目本来不出名,不过,程序在其安装脚本install.sh里的一个bug让这个项目一下子成了全世界最瞩目的项目。



那我们该如何防范这种问题呢?

(1)良好的编程习惯:变量加引号防止扩展

path="/usr/local /sbin"

# rm -rf $path

rm -rf "$path"



那我们该如何防范这种问题呢?

(1)良好的编程习惯:变量加引号防止扩展

rm -rf "~"

(2)如果不确定,删除之前 echo 或 find 一下,看变量被扩展成啥了

echo rm -rf "~"

rm -rf ~

echo rm -rf ~

rm -rf /home/work



cd 切换目录失败,导致文件被误删

cd ooxx_path_not_exsit

rm -rf *.exe


5、终极解决方案



不要使用 root 操作系统资源,这样至少不会删除系统文件。

6、在登录 shell 下使用友好的提示符

友好的命令提示符能时刻提醒操作者当前在哪个路径下,避免错误的路径下操作文件。


来自:https://mp.weixin.qq.com/s/_aRRFK4fwnp4uSLQ4tOOhA
#VAR1="2323232"
#VAR2="VAR1"

#eval echo \$$VAR2
2323232
这个用法的确可行,但是看起来十分的不舒服,很难只管的去理解,我们并不推荐。而且事实上我们本身就不推荐使用eval这个命令。
比较舒服的写法是下面这样:
#echo ${!VAR2}
2323232

From:
https://mp.weixin.qq.com/s/U1KirpXB4G82mqa0H9ylKQ


二)Centos安装shellcheck的方法
shellcheck
shellcheck是用来检查shell脚本的工具。
采用haskell语言开发。
在ubuntu中,可以直接采用apt install shellcheck安装完成
但是在Centos,yum是没有shellcheck的包的,因此,需要另一种方法安装

Centos安装shellcheck
由于shellcheck是haskell语言开发的,

因此,会想到使用haskell的包管理工具cabal来安装。

yum install cabal-install
这样,就可以使用cabal install 来安装东西了

在cabal install shellcheck之前还有些功夫要做。

注意,以下指令都会安装在~/.cabal/bin目录下

cabal update
cabal install cabal
cabal install shellcheck
cabal install cabal的意思是安装必要的cabal库,否则安装shellcheck时会报错,必须的。

有意思的是,在A用户安装了以上的东西,
su到B用户,以上的步骤还得来一次,呵呵

来自:https://www.cnblogs.com/wenxingxu/p/9547611.html
https://www.cnblogs.com/zqb-all/p/10054594.html
分页: 1/26 第一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 下页 最后页 [ 显示模式: 摘要 | 列表 ]