PHP 将脚本执行限制为命令行

函数php_sapi_name()和常量PHP_SAPI都返回PHP使用的接口类型( S erver API )。它们可用于通过检查函数的输出是否等于cli来将脚本的执行限制到命令行。

if (php_sapi_name() === 'cli') {
    echo "Executed from command line\n";
} else {
    echo "Executed from web browser\n";
}

drupal_is_cli()函数是一个函数示例,它检测脚本是否已从命令行执行:

function drupal_is_cli() {
    return (!isset($_SERVER['SERVER_SOFTWARE']) && (php_sapi_name() == 'cli' || (is_numeric($_SERVER['argc']) && $_SERVER['argc'] > 0)));
}

lnmp 1.6安装tinkphp 5.0以上防跨目录设置问题,lnmp中遇到open_basedir配置无效问题。

在使用LNMP包安装PHP时,发现直接修改php.ini的配置是无法生效的,其原因竟然是因为nginx的配置文件,覆盖了php.ini的配置。
——————————————————————–
LNMP 1.4上如果不想用防跨目录还需要将 /usr/local/nginx/conf/fastcgi.conf 里面的fastcgi_param PHP_ADMIN_VALUE “open_basedir=$document_root/:/tmp/:/proc/”; 删除或注释,需要重启nginx。
LNMP 1.4上也可以直接使用lnmp1.4/tools/ 目录下的 ./remove_open_basedir_restriction.sh 进行移除。

lnmp 开启php错误打印

php –ini
Configuration File (php.ini) Path: /usr/local/php/etc
Loaded Configuration File: /usr/local/php/etc/php.ini
Scan for additional .ini files in: /usr/local/php/conf.d
Additional .ini files parsed: (none)

vi /usr/local/php/etc/php.ini

在文件中查找 ‘display_errors’   查找到 display_errors = Off 或者 display_errors = On, Off为关闭错误提示,On为打开错误提示,根据需求修改即可。

也可在php文件中加入以下代码

 

//禁用错误报告
error_reporting(0);
//报告运行时错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);
//报告所有错误
error_reporting(E_ALL);

 

解决 Windows 环境 Git Bash 里无法识别 Composer 命令的问题

 

解决

首先,请确定你的 composer.phar 文件安装路径。我的是: /d/wamp64/bin/php/php5.6.31/composer.phar (请把类似 D:\ 的盘符改为 /d/)。

然后复制、并修改权限

D:\software\Git\usr\bin

复制一个 composer  composer.bat composer.phar 文件到 Git Bash 的 /usr 的子目录,并赋予执行权限。

cp /d/wamp64/bin/php/php5.6.31/composer.phar /usr/local/bin/composer
chmod a+x /usr/local/bin/composer

windows中使用git-bash,新增快捷命令php7 php 环境变量

windows上环境变量中的php配置的php5.3.6,但是想要在windows上的git-bash 使用php7。

1 使用git-bash,使用vi打开文件aliases.sh:


ttwp@ttwp MINGW64 /c/xampp/htdocs/laravel-git (5.3)

$ vi /etc/profile.d/aliases.sh

2 在该文件中新增一条代码:


alias php7='C:/xampp/php7/php-7.3.3-Win32-VC15-x64/php'

单引号中间的是你的php7的安装路径。

3 将git-bash关闭后,重新打开,输入php7 -v:


ttwp@ttwp MINGW64 /c/xampp/htdocs/laravel-git (5.3)

$ php7 -v

PHP 7.3.3 (cli) (built: Mar  6 2019 21:53:23) ( ZTS MSVC15 (Visual C++ 2017) x64 )

Copyright (c) 1997-2018 The PHP Group

Zend Engine v3.3.3, Copyright (c) 1998-2018 Zend Technologies

ttwp@ttwp MINGW64 /c/xampp/htdocs/laravel-git (5.3)

$ php -v

PHP 5.6.32 (cli) (built: Oct 25 2017 16:02:15)

Copyright (c) 1997-2016 The PHP Group

Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

ubuntu 安装 Supervisor-守护进程工具

爬虫worker端安装使用supervisor进程管理工具安装使用

测试场景,脚本执行1分钟后结束进程(sleep演示测试),进程结束后,supervisor重新开启该线程

1.编辑sh脚本

cd /root
vi e.sh

sleep 60;

echo $(date “+%y-%m-%d %H:%M:%S”)>> date.txt ;

定时将时间写入date.txt文件

supervisor

安装supervisor
  1. apt-get install supervisor
配置进程管理配置文件

查看配置文件

  1. cat /etc/supervisor/supervisord.conf

编辑配置文件

通过运行echo_supervisord_conf程序生成supervisor的初始化配置文件,如下所示:

echo_supervisord_conf > /etc/supervisor/supervisord.conf

然后查看路径下的supervisord.conf。在文件尾部添加如下配置。

;[include]
;files = relative/directory/*.ini

;conf.d 为配置表目录的文件夹,需要手动创建
[include]
files = conf.d/*.conf





  1. supervisord启动成功后,可以通过supervisorctl客户端控制进程,启动、停止、重启。运行supervisorctl命令,不加参数,会进入supervisor客户端的交互终端,并会列出当前所管理的所有进程。
  2. supervisord -c /etc/supervisor/supervisord.conf  //启动服务
  3. vi /etc/supervisor/supervisord.conf

新增以下信息

program:当前worker进程的名称
command= 进程执行的文件
directory= 执行文件所在目录
numprocs=线程偶同时执行的个数

  1. [program:date]
  2. command=sh e.sh
  3. directory=/root
  4. process_name=%(program_name)s-%(process_num)s
  5. numprocs=1
  6. autorestart=true

更多相关命令

一、添加好配置文件后

二、更新新的配置到supervisord

  1. supervisorctl update

三、重新启动配置中的所有程序

  1. supervisorctl reload

四、启动某个进程(program_name=你配置中写的程序名称)

  1. supervisorctl start program_name

五、查看正在守候的进程

  1. supervisorctl

六、停止某一进程 (program_name=你配置中写的程序名称)

  1. supervisorctl stop program_name

七、重启某一进程 (program_name=你配置中写的程序名称)

  1. supervisorctl restart program_name

八、停止全部进程

  1. supervisorctl stop all

注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

centos 使用docker搭建Gearman任务分发系统 ,Gearman的安装和使用

第一步,centos 安装 docker,拉取docker centos 镜像(此处不赘述)

https://docs.docker.com/install/linux/docker-ce/centos/

docker -v

docker ps  (查看docker的容器状态)

docker pull centos(docker安装ubuntu最新镜像)
docker images (查看本地所有镜像)

 

[root@izwz9c4rb2kbs0ggxd67hiz ~]# docker run -d -it –name=gearman-container centos:latest /bin/bash(name前面双横线)

docker ps

docker exec -it f49a2392164e /bin/bash

f49a2392164e(CONTAINER ID)

 

以centos运行docker容器

第二步,搭建Gearman任务分发系统

yum update

[root@f49a2392164e /]# yum install gearmand
Loaded plugins: fastestmirror, ovl
Loading mirror speeds from cached hostfile
* base: mirrors.163.com
* extras: mirrors.163.com
* updates: mirrors.cn99.com
No package gearmand available.
Error: Nothing to do

yum没有找到对应依赖包,更新epel第三方软件库,运行命令:
yum install -y epel-release

更新完epel第三方软件库后,再次尝试使用yum命令安装对应的软件包

yum install gearmand

remi — linux下比较好用的安装源

yum install wget

在centOS下下载源

su
cd /etc/yum.repos.d
wget http://rpms.famillecollet.com/enterprise/remi.repo

安装php扩展

yum install –enablerepo=remi –enablerepo=remi-php56 php-pecl-gearman

或升级:
yum –enablerepo=remi-php55,remi update php*

查看扩展是否安装成功

php -m | grep gearman

 

worker.php

<?php
    $worker= new GearmanWorker();
    $worker->addServer("127.0.0.1", 4730);  
    $worker->addFunction("title", "title_function");
    while ($worker->work());

    function title_function($job){
        return "你请求的数据:" . $job->workload() . " 请求时间:" . date('Y-m-d H:i:s');
        //return ucwords(strtolower($job->workload()));
    }
?>

 

client.php

 

<?php
    $client= new GearmanClient();
    $client->addServer("127.0.0.1", 4730);
    print $client->do("title", json_encode(
        [
            'username'=>'jack',
            'email'=>'jack@foxmail.com',
        ]
    ));
    print "\n";
?>

 

测试:

启动服务

$ sudo gearmand -d

启动worker

$ php worker.php &
[1] 15135

启动client

$ php client.php 
你请求的数据:{"username":"jack","email":"jack@foxmail.com"} 请求时间:2017-07-10 23:25:30

参考:
https://segmentfault.com/a/1190000000494087
https://www.ibm.com/developerworks/cn/opensource/os-php-gearman/
http://gearman.org/getting-started/#client
http://php.net/manual/zh/book.gearman.php

https://www.jianshu.com/p/c7a55dee5796

php unserialize 返回false的解决方法

php unserialize 返回false的解决方法

php 提供serialize(序列化) 与unserialize(反序列化)方法。

使用serialize序列化后,再使用unserialize反序列化就可以获取原来的数据。


<?php
$arr = array(
'name' => 'fdipzone',
'gender' => 'male'
);

$str = serialize($arr); //序列化
echo 'serialize str:'.$str."\r\n\r\n";

$content = unserialize($str); // 反序列化
echo "unserialize str:\r\n";
var_dump($content);

 

输出:

serialize str:a:2:{s:4:”name”;s:8:”fdipzone”;s:6:”gender”;s:4:”male”;}

unserialize str:
array(2) {
[“name”]=>
string(8) “fdipzone”
[“gender”]=>
string(4) “male”
}

但下面这个例子反序列化会返回false

 


<?php
$str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"新晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"中国北京市 北京市移动";s:4:"miao";s:1:"5";}';
var_dump(unserialize($str)); // bool(false)
?>

检查序列化后的字符串,发现出问题是在两处地方
s:5:”url”

s:29:”http://www.baidu.com/test.html”

这两处应为

s:3:”url”

s:30:”http://www.baidu.com/test.html”

出现这种问题的原因是序列化数据时的编码与反序列化时的编码不一致导致,例如数据库是latin1和UTF-8字符长度不一样。

另外有可能出问题的还有单双引号,ascii字符”\0″被解析为 ‘\0’,\0在C中是字符串的结束符等于chr(0),错误解析后算了2个字符。

\r在计算长度时也会出问题。

解决方法如下:


// utf8
function mb_unserialize($serial_str) {
$serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
$serial_str= str_replace("\r", "", $serial_str);
return unserialize($serial_str);
}

// ascii
function asc_unserialize($serial_str) {
$serial_str = preg_replace('!s:(\d+):"(.*?)";!se', '"s:".strlen("$2").":\"$2\";"', $serial_str );
$serial_str= str_replace("\r", "", $serial_str);
return unserialize($serial_str);
}

&nbsp;

echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';
 
// utf8
function mb_unserialize($serial_str) {
 $serial_str= preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str );
 $serial_str= str_replace("\r", "", $serial_str);
 return unserialize($serial_str);
}
 
$str = 'a:9:{s:4:"time";i:1405306402;s:4:"name";s:6:"新晨";s:5:"url";s:1:"-";s:4:"word";s:1:"-";s:5:"rpage";s:29:"http://www.baidu.com/test.html";s:5:"cpage";s:1:"-";s:2:"ip";s:15:"117.151.180.150";s:7:"ip_city";s:31:"中国北京市 北京市移动";s:4:"miao";s:1:"5";}';
 
var_dump(unserialize($str)); // false
 
var_dump(mb_unserialize($str)); // 正确

使用处理过单双引号,过滤\r的mb_unserialize方法就能成功反序列化了。
使用unserialize
bool(false)

使用mb_unserialize
array(9) {
 ["time"]=>
 int(1405306402)
 ["name"]=>
 string(6) "新晨"
 ["url"]=>
 string(1) "-"
 ["word"]=>
 string(1) "-"
 ["rpage"]=>
 string(30) "http://www.baidu.com/test.html"
 ["cpage"]=>
 string(1) "-"
 ["ip"]=>
 string(15) "117.151.180.150"
 ["ip_city"]=>
 string(31) "中国北京市 北京市移动"
 ["miao"]=>
 string(1) "5"
}

PHP函数能解码德语 实体符号 转成 实际字符(ä,ö,ë)


Schlankheitspillen Fat Burner | Abnehmen BMI Gewichts-Kontrolle l Fettverbrenner Gewichtabnahme| Appetitz&amp;uuml;gler - Unterdr&amp;uuml;ckung Fetts&amp;auml;uren &amp;amp; F&amp;ouml;rderung Fettabbau Di&amp;auml;t| Glavonoid - Japan


&lt;?php

$title='Schlankheitspillen Fat Burner | Abnehmen BMI Gewichts-Kontrolle l Fettverbrenner Gewichtabnahme| Appetitz&amp;uuml;gler - Unterdr&amp;uuml;ckung Fetts&amp;auml;uren &amp;amp; F&amp;ouml;rderung Fettabbau Di&amp;auml;t| Glavonoid - Japan';
echo html_entity_decode($title);

echo strlen(htmlspecialchars_decode($title));

//输出内容
Schlankheitspillen Fat Burner | Abnehmen BMI Gewichts-Kontrolle l Fettverbrenner Gewichtabnahme| Appetitzügler - Unterdrückung Fettsäuren &amp; Förderung Fettabbau Diät| Glavonoid - Japan

猜你会用到一下内容

PHP怎么将HTML实体转换为普通字符

<?php

$my_str = "I&#039;m good &amp; &lt;b&gt;&quot;boy &quot;&lt;/b&gt;.";

echo htmlspecialchars_decode($my_str);

echo "<br>";

echo htmlspecialchars_decode($my_str, ENT_QUOTES);

echo "<br>";

echo $my_str;