Linux下编译安装以及配置PHP环境 Nginx Swoole

yum update
#安装编译工具
yum -y install gcc gcc-c++ pcre openssl openssl-devel curl curl-devel libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel pcre pcre-devel libxslt libxslt-devel bzip2 bzip2-devel make
#php下载以及安装https://www.php.net/downloads
wget -c  http://www.php.net/distributions/php-7.2.33.tar.gz
#解压安装包
tar -zxvf php-7.2.33.tar.gz
#进入目录开始编译安装
cd php-7.2.33
#配置
./configure --prefix=/usr/local/php7.2
make && make install
#安装成功后配置PHP环境变量
方法一、建立软链接
ln -s /usr/local/php7.2/bin/php /usr/bin/php

方法二
vi ~/.bash_profile

增加
alias php=/usr/local/php7.2/bin/php

source ~/.bash_profile
#增加配置文件

查看配置文件目录
php -i |grep php.ini

[root@7c73e1180bfb lib]# php -i |grep php.ini
Configuration File (php.ini) Path => /usr/local/php7.2/lib


将编译目录配置文件拷贝到对应目录
cp php.ini-production /usr/local/php7.2/lib/php.ini
#编译安装swoole
#Swoole 扩展是按照 PHP 标准扩展构建的。使用 phpize 来生成编译检测脚本,./configure 来做编译配置检测,make 进行编译,make install 进行安装。

#下载页面 https://github.com/swoole/swoole-src/releases

#下载源码
wget -c https://github.com/swoole/swoole-src/archive/v4.4.18.tar.gz

#解压 tar -zxvf v4.4.18.tar.gz

#进入解压目录
cd swoole-src-4.4.18/

生成configure文件
/usr/local/php7.2/bin/phpize

########注意################
#执行出错提示未安装
[root@7c73e1180bfb swoole-src-4.4.18]# phpize
Configuring for:
PHP Api Version:         20170718
Zend Module Api No:      20170718
Zend Extension Api No:   320170718
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.


#安装 autoconf

yum install autoconf
#重试上一步
/usr/local/php7.2/bin/phpize

#编译配置检测
./configure --with-php-config=/usr/local/php7.2/bin/php-config

# make 进行编译,make install 进行安装。
make && make install

#安装目录
[root@7c73e1180bfb swoole-src-4.4.18]# make install
Installing shared extensions:     /usr/local/php7.2/lib/php/extensions/no-debug-non-zts-20170718/
Installing header files:          /usr/local/php7.2/include/php/

#php配置文件中引入swoole扩展
vi /usr/local/php7.2/lib/php.ini

新增一行数据
extension=swoole
或者
#extension = "/usr/local/php7.2/lib/php/extensions/no-debug-non-zts-20170718//swoole.so"

#查看扩展是否已经引用成功
php -m

php 测试题

<?php 
   static $num = 3;
   echo $num;exit;
   static $num=5;
?> 
<?php 
   $num = 3;
   echo $num;exit;
   static $num=5;
?> 
<?php 
function myTest(){
   static $num = 3;
   echo $num;exit;
   static $num=5;

  }
myTest();
?> 
<?php 
function myTest(){
    $num = 3;
   echo $num;exit;
   static $num=5;

  }
myTest();
?> 

Google Translate 谷歌翻译API 使用教程之PHP

Google Translate

Translation
利用 Google 机器学习技术在多种语言之间动态互译
根据您的内容需求提供快速、动态的翻译
Translation 服务让组织能够利用 Google 预先训练或自定义的机器学习模型,在多种语言之间动态互译。

官方地址: https://cloud.google.com/translate/#section-1

准备工作

设置 Cloud Console 项目。
设置项目 https://cloud.google.com/translate/docs/basic/setup-basic

点击即可执行以下操作:

创建或选择项目。
为该项目启用 Cloud Translation API。
创建服务帐号。
下载 JSON 格式的私钥。
您可以随时在 Cloud Console 中查看和管理这些资源。https://console.cloud.google.com

1.创建项目

2.您需要为此项目提供一个计费帐户,然后才能激活该服务。 访问API控制台以配置结算帐户,然后返回此处继续操作。

3.下载秘钥

4.为项目开启API功能

5.搜索需要开启的API类型

6.创建API Key

安装与使用

安装 Cloud Translation 基本版客户端库

客户端库支持多种主流语言,建议您使用这些客户端库。如需安装客户端库,请执行以下操作:

composer install google/cloud-translate

php 使用方法

use Google\Cloud\Translate\V2\TranslateClient;

调用示例

#实例化翻译类
$translate = new TranslateClient([
      'key' => 'AIzaSyCkSxy7UtjwXaBg5-hLWk0FnSWXXXXXXXXXX'
]);
// Translate text from english to french.
$result = $translate->translate('Get the languages supported for translation specifically for your target language.', 
[
        'source' => 'en',//默认EN,不设置自动检测原始语言
        'target' => 'zh-CN'
]);

echo $result['text'] . "\n";
// Detect the language of a string.
$result = $translate->detectLanguage('Greetings from Michigan!');

echo $result['languageCode'] . "\n";
// Get the languages supported for translation specifically for your target language.
$languages = $translate->localizedLanguages([
    'target' => 'en'
]);

foreach ($languages as $language) {
    echo $language['name'] . "\n";
    echo $language['code'] . "\n";
}
// Get all languages supported for translation.
$languages = $translate->languages();

foreach ($languages as $language) {
    echo $language . "\n";
}


输出: af am ar az be bg bn bs ca ceb co cs cy da de el en eo es et eu fa fi fr fy ga gd gl gu ha haw he hi hmn hr ht hu hy id ig is it iw ja jw ka kk km kn ko ku ky la lb lo lt lv mg mi mk ml mn mr ms mt my ne nl no ny or pa pl ps pt ro ru rw sd si sk sl sm sn so sq sr st su sv sw ta te tg th tk tl tr tt ug uk ur uz vi xh yi yo zh zh-CN zh-TW zu

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,新增快捷命令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

php 图形用户界面GUI 开发

一、下载指定系统扩展

1
2
http://pecl.php.net/package/ui
http://pecl.php.net/package/ui/2.0.0/windows

由于我的系统是64位win10,php版本是7.1,所以选择7.1 Thread Safe (TS) x64,linux用户可以自行下载源码包,编译安装。

解压php_ui-2.0.0-7.1-ts-vc14-x64.zip,把php_ui.dll复制到你php.ini中extension_dir设置的目录,把libui.dll和pthreadVC2.dll复制到C:\Windows\System32目录下。

在php.ini中加入如下:

1
extension=php_ui.dll

然后重启服务,phpinfo()查看,ui扩展安装成功。

 

二、我们创建一个简单的计算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<?php
use UI\Window;
use UI\Size;
use UI\Controls\Entry;
use UI\Controls\Label;
use UI\Controls\Button;
use UI\Controls\Grid;
//创建一个窗口
//参数一表示窗口标题
//参数二表示窗口大小
//参数三表示是否显示菜单
$win new Window('简单的计算器'new Size(640, 480), true);
//创建一个文本框
//Entry::Normal 普通单行文本框
//Entry::Password 密码框
//Entry::Search 搜索框
$num1 new Entry(Entry::Normal);
$num2 new Entry(Entry::Normal);
$ret new Entry(Entry::Normal);
//创建一个标签
$lab new Label('+');
//创建一个按钮
$btn new class('计算'extends Button {
    public function __construct($text) {
        parent::__construct($text);
    }
    protected function onClick() {
        global $num1$num2$ret;
        $n1 $num1->getText();
        $n2 $num2->getText();
        $ret->setText($n1 $n2);
    }
};
//创建一个网格
$grid new Grid();
//把上面的控件加入到网格布局中
$grid->append($num1, 0, 0, 1, 1, true, Grid::Center, false, Grid::Center);
$grid->append($lab, 0, 1, 1, 1, true, Grid::Center, false, Grid::Center);
$grid->append($num2, 0, 2, 1, 1, true, Grid::Center, false, Grid::Center);
$grid->append($btn, 0, 3, 1, 1, true, Grid::Center, false, Grid::Center);
$grid->append($ret, 0, 4, 1, 1, true, Grid::Center, false, Grid::Center);
//把布局加入到窗口中
$win->add($grid);
//显示窗口
$win->show();
UI\run();

在控制台下运行php脚本

1
> php index.php

运行结果如下:

 

三、我们创建一个常用的注册表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
use UI\Window;
use UI\Size;
use UI\Controls\Box;
use UI\Controls\Entry;
use UI\Controls\Button;
use UI\Controls\Form;
use UI\Controls\Radio;
use UI\Controls\Check;
use UI\Controls\Combo;
use UI\Controls\MultilineEntry;
//创建一个窗口
//参数一表示窗口标题
//参数二表示窗口大小
//参数三表示是否显示菜单
$win new Window('简单的计算器'new Size(640, 480), true);
//创建一个表单
$frm new Form();
//用户名
$user new Entry(Entry::Normal);
$frm->append('用户名:'$user, false);
//密码
$pwd new Entry(Entry::Password);
$frm->append('密码:'$pwd, false);
//性别(单选)
$sex new Radio();
$sex->append("男");
$sex->append("女");
$sex->append("未知");
$frm->append('性别:'$sex, false);
//爱好(多选)
//创建一个盒子,水平排列
$loveBox new Box(Box::Horizontal);
$love1 new Check('看书');
$love2 new Check('旅游');
$love3 new Check('游戏');
//把多选控件加入盒子中
$loveBox->append($love1);
$loveBox->append($love2);
$loveBox->append($love3);
$frm->append('爱好:'$loveBox, false);
//地区(下拉框)
$area new Combo();
$area->append("北京");
$area->append("上海");
$area->append("武汉");
$frm->append('地区:'$area, false);
//简介(多行文本)
$desc new MultilineEntry();
$frm->append('简介:'$desc, false);
//注册按钮
$reg new class('注册'$winextends Button {
    protected $win;
    public function __construct($text$win) {
        $this->win = $win;
        parent::__construct($text);
    }
    //用于重写父类的单击事件
    protected function onClick() {
        $this->win->msg('消息''你点击了注册按钮');
    }
};
$frm->append(''$reg);
$win->add($frm);
//显示窗口
$win->show();
UI\run();

运行结果如下:

为了避免每次都要打命令运行php脚本,我们可以写个bat脚本来运行。

1
2
D:\amp\php7\php.exe -f D:\wwwroot\demo1\index.php
pause

注意php.exe的路径和运行脚本路径,保存为run.bat,运行结果如下:

Ajax跨域请求,无法传递及接收cookie信息解决方案 (开发背景:实现跨域登录)

//php脚本增加
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Max-Age: 1000');
header('Access-Control-Allow-Credentials: true');
/*js设置登录状态*/
$.ajax({
    url:"https://goonls.com/sign-in.php",
    cache:false,
    data:{user:$('#user_email').val(),password:$('#exampleInputPassword1').val()},
    method:"POST",
    dataType:'json',
    xhrFields:{//这里是重点
        withCredentials:true
    },
    success:function (data) {

    },
    error:function (e) {

    }
});

参考地址

https://www.cnblogs.com/yalong/p/9067525.html

HTML5 Access-Control-Allow-Origin解决跨域问题

mysql根据经纬度获取附近的商家

创建geo表

create table geo(
    geo_id INT NOT NULL AUTO_INCREMENT,
    lng float NOT NULL,
    lat float NOT NULL,
    name VARCHAR(100) NULL,
    PRIMARY KEY ( geo_id )
);
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.302416,33.958887,"实验小学");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.303997,33.95188,"宿迁市人民医院");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.302991,33.935828,"宿迁学院");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.28215,33.959307,"金陵名府");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.290081,33.925404,"润园");
INSERT INTO `geo`(`lng`, `lat`, `name`) VALUES (118.354751,33.959007,"国际馆");

下面是google给的解决方案(基于公里km)。

SELECT  
  geo_id, `name`,(  
    6371 * acos (  
      cos ( radians(33.958887) )  
      * cos( radians( lat ) )  
      * cos( radians( lng ) - radians(118.302416) )  
      + sin ( radians(33.958887) )  
      * sin( radians( lat ) )  
    )  
  ) AS distance  
FROM geo
HAVING distance < 20  
ORDER BY distance 
LIMIT 0 , 20

其中33.958887是纬度,118.302416是经度。

牛了个逼的。

/** 附近的商家 */
public function get_near_business() {
        if (!$this->validate->validate('lng', ['require','regex|-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,4})?)|180(([.][0]{1,4})?))'])) { // 经度
            $this->json->setErr(10001, '缺少lng或lng格式不正确');
            $this->json->Send();
        }
        if (!$this->validate->validate('lat', ['require','regex|-?((0|[1-8]?[0-9]?)(([.][0-9]{1,4})?)|90(([.][0]{1,4})?))'])) { // 纬度
            $this->json->setErr(10001, '缺少lat或lng格式不正确');
            $this->json->Send();
        }

        if (!isset($_POST['page']) || $_POST['page'] < 1) {
            $_POST['page'] = 1;
        }
        // 分页获取附近的商家信息
        $sql_count = "SELECT  id, `name`,( 6371 * acos (  
                    cos ( radians(".$_POST['lat'].") )  
                    * cos( radians( lat ) )  
                    * cos( radians( lng ) - radians(".$_POST['lng'].") )  
                    + sin ( radians(".$_POST['lat'].") )  
                    * sin( radians( lat ) )  
                    )  
                ) AS distance  
                FROM tf_my_business
                WHERE `status` = 1
                HAVING distance < 10";
        $count = count(M()->query($sql_count));
        $hasPage = ceil($count / C('PAGE.LIMIT'));
        $hasPage = $hasPage ? $hasPage : 1;

        if ($_POST['page'] > $hasPage) {
            $this->json->setErr(10002, '页数有误');
            $this->json->Send();
        }

        $limit = (($_POST['page'] - 1) * C('PAGE.LIMIT')) . "," .C('PAGE.LIMIT');
        $sql_list = "SELECT  `id`,`name`,`info`,( 6371 * acos (  
                    cos ( radians(".$_POST['lat'].") )  
                    * cos( radians( lat ) )  
                    * cos( radians( lng ) - radians(".$_POST['lng'].") )  
                    + sin ( radians(".$_POST['lat'].") )  
                    * sin( radians( lat ) )  
                    )  
                ) AS distance  
                FROM tf_my_business
                WHERE `status` = 1
                HAVING distance < 10 
                ORDER BY distance ASC 
                LIMIT ".$limit;
        $datalist = M()->query($sql_list);
        if ($datalist) {
            // 处理datalist
            $my_business_img_model = M('my_business_img');
            foreach ($datalist as &$v) {
                // 获取主图
                $my_business_img_info = $my_business_img_model->where(['m_b_id'=>$v['id'],'type'=>1,'is_main'=>1])->find();
                $v['img'] = $my_business_img_info['img'];
                if (strpos($v['img'],'cdn') === false) {
                    $v['img'] = C('CDN.URI').$v['img'];
                }
            }

            $data['datalist'] = $datalist;
            $data['current_page'] = $_POST['page'];
            $data['hasPage'] = $hasPage;
            $this->json->setErr(0, '获取成功');
            $this->json->setAttr('data',$data);
            $this->json->Send();
        } else {
            $this->json->setErr(10003, '暂无数据');
            $this->json->Send();
        }
}
{
    "errno": 0,
    "errdesc": "获取成功",
    "timestamp": 1524749336,
    "data": {
        "datalist": [
            {
                "id": "3",
                "name": "京东",
                "info": "京东",
                "distance": "4.665364145881758",
                "img": "https://cdn.caomall.net/1524732806744365022.png"
            }
        ],
        "current_page": "1",
        "hasPage": 1
    }
}

 

https://www.cnblogs.com/jiqing9006/p/8954831.html

 

php获取html内的纯文本

在写xml的时候,文档要求内容里面只要图片和段落就可以了,其他的css,js什么的都不需要。

所以,在输出的时候,就要用正则去过滤掉不需要的标签代码。

第一种:php正则去除js标签代码。

$preg = "/<script[\s\S]*?<\/script>/i";
$content = preg_replace($preg, "", $content);

第二种:php正则去除meta标签

$preg = "/<meta[\s\S]*?>/i";
$content = preg_replace($preg, "", $content);

第三种:php正则去除link标签

$preg = "/<link[\s\S]*?>/i";
$content = preg_replace($preg, "", $content);

第四种:php正则去除页内css样式

$preg = "/<style[\s\S]*?<\/style>/i";
$content = preg_replace($preg, "", $content);

第五种:php正则去除行内样式,id,class等

$preg = "/(style|id|class)=\"[\s\S]*?\"/i";
$content = preg_replace($preg, "", $content);

其他的标签可以自行脑补。

 

 

[php]
<pre>function getClearStr($str){
//去掉中,英文标点符号和HTML代码
$str = preg_replace( "/<style[\s\S]*?<\/style>/i", "", $str );
$str = preg_replace( "/<script[\s\S]*?<\/script>/i", "", $str );
$str=preg_replace(‘/\s/’,”,preg_replace("/[[:punct:]]/",”,strip_tags(html_entity_decode($str,ENT_QUOTES,’UTF-8′))));

return $str;
}</pre>
[/php]

令人困惑的strtotime

经常会有人被strtotime结合-1 month, +1 month, next month的时候搞得很困惑, 然后就会觉得这个函数有点不那么靠谱, 动不动就出问题. 用的时候就会很慌…

这不, 刚刚就有人在微博上又问我:

鸟哥,今天是2018-07-31 执行代码:

  1. date(“Y-m-d”,strtotime(“-1 month”))

怎么输出是2018-07-01?

好的吧, 虽然这个问题看起来很迷惑, 但从内部逻辑上来说呢, 其实是”对”的, 你先别着急哈, 让我慢慢讲:

我们来模拟下date内部的对于这种事情的处理逻辑:

  • 1. 先做-1 month, 那么当前是07-31, 减去一以后就是06-31.
  • 2. 再做日期规范化, 因为6月没有31号, 所以就好像2点60等于3点一样, 6月31就等于了7月1

是不是逻辑很”清晰”呢? 我们也可以手动验证第二个步骤, 比如:

  1. var_dump(date(“Y-m-d”, strtotime(“2017-06-31”)));
  2. //输出2017-07-01

也就是说, 只要涉及到大小月的最后一天, 都可能会有这个迷惑, 我们也可以很轻松的验证类似的其他月份, 印证这个结论:

  1. var_dump(date(“Y-m-d”, strtotime(“-1 month”, strtotime(“2017-03-31”))));
  2. //输出2017-03-03
  3. var_dump(date(“Y-m-d”, strtotime(“+1 month”, strtotime(“2017-08-31”))));
  4. //输出2017-10-01
  5. var_dump(date(“Y-m-d”, strtotime(“next month”, strtotime(“2017-01-31”))));
  6. //输出2017-03-03
  7. var_dump(date(“Y-m-d”, strtotime(“last month”, strtotime(“2017-03-31”))));
  8. //输出2017-03-03

那怎么办呢?

从PHP5.3开始呢, date新增了一系列修正短语, 来明确这个问题, 那就是”first day of” 和 “last day of”, 也就是你可以限定好不要让date自动”规范化”:

  1. var_dump(date(“Y-m-d”, strtotime(“last day of -1 month”, strtotime(“2017-03-31”))));
  2. //输出2017-02-28
  3. var_dump(date(“Y-m-d”, strtotime(“first day of +1 month”, strtotime(“2017-08-31”))));
  4. ////输出2017-09-01
  5. var_dump(date(“Y-m-d”, strtotime(“first day of next month”, strtotime(“2017-01-31”))));
  6. ////输出2017-02-01
  7. var_dump(date(“Y-m-d”, strtotime(“last day of last month”, strtotime(“2017-03-31”))));
  8. ////输出2017-02-28

那如果是5.3之前的版本(还有人用么?), 你可以使用mktime之类的, 把所有的日子忽略掉, 比如都限定为每月1号就可以了, 只不过就不如直接用first day来的更加优雅.

现在, 搞清楚了内部原理, 是不是就不慌了? 🙂