PHP中,如何吧返回的json对象转数组

再爬取一些网页的时候,返回的数据经常是json对象,例如:

var json={rank:["0022562,002256,兆新股份,2.65,2.79,2.92,2.92,2.66,16703,590878,0.27,10.19%,2.83,9.81,100.00,196178,951,262080,328798,-1,0,0.00,0.94,4.25,-,001153|002538|003549|003571,2.92,-,2019-08-21 15:00:00,0,1882411872,5496642810,12.56"],pages:3694}

我们会发现大括号里面的内容对于php来说不是标准的json格式,所以我们得先处理下:

1: 提取我们需要的内容
$ret = explode("=", $data);
$str = $ret[1];

2: 正则匹配,替换成我们需要的数据形式
$str2 = preg_replace(["/([a-zA-Z_]+[a-zA-Z0-9_])\s:/", "/:\s'(.?)'/"], ['"\1":', ': "\1"'], $str);
得到结果如下:
{"rank":["0022562,002256,兆新股份,2.65,2.79,2.92,2.92,2.66,16703,590878,0.27,10.19%,2.83,9.81,100.00,196178,951,262080,328798,-1,0,0.00,0.94,4.25,-,001153|002538|003549|003571,2.92,-,2019-08-21 15:00:00,0,1882411872,5496642810,12.56"],"pages":3694}

3: $ret = json_decode($str2,true);

MAC 安装docker,docker使用方法

mac 安装

brew cask install docker

成功后目录 /Applications/Docker.app/Contents/Resources/bin/docker

设置环境变量

sudo vim /etc/profile (在文档最后,添加: export PATH="/Applications/Docker.app/Contents/Resources/bin:$PATH")
保存,退出,然后运行: source /etc/profile

查看安装版本 : docker --version

镜像加速 Docker for mac 应用图标 -> Perferences… -> Daemon -> Registry mirrors 添加 网易的镜像地址:http://hub-mirror.c.163.com

点击 Apply & Restart 按钮 最后用 docker info 查看 出现 : Registry Mirrors: http://hub-mirror.c.163.com 代表配置成功

docker 基本操作

docker run ubuntu:15.10 /bin/echo "Hello world"

各个参数解析:
    docker: Docker 的二进制执行文件。
    run:与前面的 docker 组合来运行一个容器。
    ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
    /bin/echo "Hello world": 在启动的容器里执行的命令  

运行交互式的容器 我们通过docker的两个参数 -i -t,让docker运行的容器实现"对话"的能力

docker run -i -t ubuntu:15.10 /bin/bash

各个参数解析:
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。

启动容器(后台模式)

docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

查看正在运行的 docker

docker ps

查看所有的历史 docker

docker ps -a 注: 不用每次使用都重新启动一个容器,这个命令可以查找上次使用过的容器

查看容器类标准输出 两种方式

docker logs 2b1b7a428627 (容器ID)
docker logs festive_bose (docker分配的容器名称)

停止容器

docker stop 2b1b7a428627

开始容器

docker start 2b1b7a428627

重启容器

docker restart 2b1b7a428627

重新进去已经拉起的容器

docker attach 2b1b7a428627

运行一个web应用

docker pull training/webapp  //载入镜像
docker run -d -P training/webapp python app.py   //后台运行一个Python应用
参数说明:
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。系统分配

docker info 查看信息

Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。
这里可以通过浏览器访问 : 127.0.0.1:32768 输出 : hello world

可以用 -p 设置不一样的端口 多个-p 可以映射多个端口

docker run -d -p 5000:5000 training/webapp python app.py

指定端口查看容器 docker port NAMES

日志查看 -f 类似于tail -f

docker logs -f NAMES

docker top 来查看容器内部运行的进程

docker top NAMES

使用 docker inspect 来查看 Docker 的底层信息。它会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息

docker inspect bf08b7f2cd89

查看docker上所有的容器

docker ps -a

删除一个不需要的容器

docker rm NAMES

docker 镜像使用

显示本机上的所有镜像

docker images

获取新的镜像

docker pull ubuntu:15.10

查找镜像, 可以从 Docker Hub 上查找 网址为: https://hub.docker.com

也可以用docker search 命令来查找
例 : docker search httpd

删除本地镜像

docker rmi -f 29e03e314ace (从最新版本开始删除,否则会报错)

创建镜像

当我们从docker镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对本地镜像进行更改。
1.从已经创建的容器中更新镜像,并且提交这个镜像
2.使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。
runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/#

在一系列骚操作后执行 : apt-get update 命令进行更新。
(如果当前版本已经过期 , 更新操作会报错
old-releases.ubuntu.com ,这是一个过期库的归档。因此,当Canonical支持的Ubuntu过期后,你必须把源切换到 old-releases.ubuntu.com
执行 :
sed -i -r 's/([a-z]{2}.)?archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sed -i -r 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list

然后使用文本编辑器打开 /etc/apt/sources.list ,找到 extras.ubuntu.com,这个库也不再支持13.04。所以你需要使用 “#” 号注释掉 extras.ubuntu.com。
    #deb http://extras.ubuntu.com/ubuntu raring main
    #deb-src http://extras.ubuntu.com/ubuntu raring main

在完成操作之后,输入 exit命令来退出这个容器。
此时ID为e218edb10161的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit来提交容器副本。

docker commit -m="has update" -a="czc" e218edb10161 czc/ubuntu:v2

各个参数说明:

-m:提交的描述信息

-a:指定镜像作者

e218edb10161:容器ID

czc/ubuntu:v2:指定要创建的目标镜像名

构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。
内容如下:
FROM centos:6.7
MAINTAINER Fisher "fisher@sudops.com"
RUN /bin/echo 'root:123456' |chpasswd
RUN useradd runoob
RUN /bin/echo 'runoob:123456' |chpasswd
RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE 22
EXPOSE 80
CMD /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。
sudo docker build -t czc/centos:6.7 .
参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

部署 nginx - php - mysql - phpMyAdmin

拉去相对应的镜像

docker pull php:7.2
docker pull nginx
docker pull mysql
docker pull phpmyadmin/phpmyadmin

注 : 由于编辑器bug,下面的 --name 和 --link 都是 两个'-' 显示成了一个

创建mysql 容器

sudo mkdir -p /Users/chuzhichao/docker/mysql/data /Users/chuzhichao/docker/mysql/logs /Users/chuzhichao/docker/mysql/conf
data 目录将映射为 mysql 容器配置的数据文件存放路径
logs 目录将映射为 mysql 容器的日志目录
conf 目录里的配置文件将映射为 mysql 容器的配置文件
命令 : docker run -p 3306:3306 --name chuzhichao-mysql -v /Users/chuzhichao/docker/mysql/logs:/logs -v /Users/chuzhichao/docker/mysql/data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 mysql

进入容器:
docker exec -it chuzhichao-mysql bash
登录mysql :
mysql -u root -p 123456
添加远程用户 :
CREATE USER 'chuzhichao'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON . TO 'chuzhichao'@'%';

或者: ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

创建关联文件夹

mkdir -p /Users/chuzhichao/docker/nginx/conf.d && mkdir /Users/chuzhichao/www && cd /Users/chuzhichao/docker/nginx/conf.d && sudo touch default.conf

创建php-fpm 容器

命令 : docker run --name chuzhichao-php -d -v /Users/chuzhichao/www:/var/www/html:ro --link chuzhichao-mysql:db php:7.2-fpm

解释 : --name chuzhichao-php 是容器的名字。
/Users/chuzhichao/www 是本地 php 文件的存储目录,/var/www/html 是容器内 php 文件的存储目录,
:ro 表示只读。
--link chuzhichao-mysql:db 这个参数就是告诉docker容器需要使用chuzhichao-mysql 容器,并将其别名为db,
这样在这两个容器里就可以使用“db”来作为提供mysql数据库服务的机器名,
所以在最后启动参数里我们使用的是“mysql -h db -u root -p ”来连接mysql数据库的。

创建nginx 容器

首先: 修改 default.conf
server {
listen 80;
server_name localhost;

            location / {
                root   /usr/share/nginx/html;
                index  index.html index.htm;
            }

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   /usr/share/nginx/html;
            }

            location ~ \.php$ {
                fastcgi_pass   php:9000;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME  /var/www/html/$fastcgi_script_name;
                include        fastcgi_params;
            }
        }   

解释 ; /var/www/html 是 chuzhichao-php 中 php 文件的存储路径,经 docker 映射,变成本地路径 /Users/chuzhichao/www

命令:
docker run --name chuzhichao-nginx -p 80:80 -d \
-v /Users/chuzhichao/www:/usr/share/nginx/html:ro \
-v /Users/chuzhichao/docker/nginx/conf.d:/etc/nginx/conf.d:ro \
--link chuzhichao-php:php \
nginx

解释: -p 80:80 用于添加端口映射,把 chuzhichao-nginx 中的 80 端口暴露出来。
/Users/chuzhichao/www 是本地 html 文件的存储目录,/usr/share/nginx/html 是容器内 html 文件的存储目录。
/Users/chuzhichao/docker/nginx/conf.d 是本地 nginx 配置文件的存储目录,/etc/nginx/conf.d 是容器内 nginx 配置文件的存储目录。
--link chuzhichao-php:php 把 chuzhichao-php 的网络并入 chuzhichao-nginx,并通过修改 chuzhichao-nginx 的 /etc/hosts,把域名 php 映射成 127.0.0.1,让 nginx 通过 php:9000 访问 php-fpm。

测试 : 在 /Users/chuzhichao/www 目录中添加index.php , index.html 访问 : http://127.0.0.1/index.php

创建 phpmyadmin 容器

docker run --name chuzhichao-myadmin -d --link chuzhichao-mysql:db -p 8080:80 phpmyadmin/phpmyadmin
测试 : 访问 http://127.0.0.1:8080/

配置swoole

拉取镜像 : docker hub上的环境为php7.1.30 + swoole4.4.3
docker pull easyswoole/easyswoole3

启动    : docker run -ti -p 9501:9501  -p 9502:9501    -v /Users/chuzhichao/easyswoole:/easyswoole        easyswoole/easyswoole3 
复制镜像内部代码 :  docker cp dfb920f228d5:/easyswoole  /Users/chuzhichao/    


-it 控制台启动容器
-p  配置映射端口, 可映射多个端口
-v  映射容器内文件到本地, 方便修改

备注 : 由于是控制台启动,所以不能用exit退出容器 , 直接关掉控制台就行  或者使用Ctrl+P+Q
       代码更新后重启容器  docker  restart 9422dbf0a863