官网首页:https://www.workerman.net/

项目地址

GitHub: https://github.com/walkor/webman

码云: https://gitee.com/walkor/webman

composer安装

1、创建项目

composer create-project workerman/webman

2、运行

进入webman目录

debug方式运行(用于开发调试)

php start.php start

daemon方式运行(用于正式环境)

php start.php start -d

注意
webman从1.2.3版本开始专门为windows系统提供了启动脚本(需要为php配置好环境变量),windows用户请双击windows.bat即可启动webman,或者运行 php windows.php启动webman。

3、访问

浏览器访问 http://ip地址:8787

PHP dotenv Installation with Composer

curl -s http://getcomposer.org/installer | php
php composer.phar require vlucas/phpdotenv

Or on Existing projects

composer require vlucas/phpdotenv

app/functions.php

<?php
/**
 * Here is your custom functions.
 */

    //输出对应的变量或者数组
    function p($var)
    {
        if (is_bool($var)) {
            var_dump($var);
        } elseif (is_null($var)) {
            var_dump(NULL);
        } else {
            echo "<pre>" . print_r($var, true) . "</pre>";
        }
    }

    //htmlspecialchars() 函数把特殊字符转换为 HTML 实体。这意味着 < 和 > 之类的 HTML 字符会被替换为 &lt; 和 &gt; 。这样可防止攻击者通过在表单中注入 HTML 或 JavaScript 代码(跨站点脚本攻击)
    //htmlentities把字符转换为 HTML 实体
    function test_input($data)
    {
        $data = trim($data);//去除用户输入数据中不必要的字符 (如:空格,tab,换行)。
        $data = stripslashes($data);//去除用户输入数据中的反斜杠 (\)
        $data = htmlspecialchars($data);
        return $data;
    }


    function post($name, $default = false, $fitt = false)
    {
        if (isset($_POST[$name])) {
            if ($fitt) {
                switch ($fitt) {
                    case 'int':
                        if (is_numeric($_POST[$name])) {
                            return $_POST[$name];
                        } else {
                            return $default;
                        }
                        break;
                    default: ;
                }
            }else {
                return $_POST[$name];
            }
        } else {
            return $default;
        }
    }

    function get($name, $default = false, $fitt = false)
    {
        if (isset($_GET[$name])) {
            if ($fitt) {
                switch ($fitt) {
                    case 'int':
                        if (is_numeric($_GET[$name])) {
                            return $_GET[$name];
                        } else {
                            return $default;
                        }
                        break;
                    default: ;
                }
            }else {
                return $_GET[$name];
            }
        } else {
            return $default;
        }
    }

    function jump($url)
    {
        header('Location:' . $url);
        exit();
    }


    function jsonTab($code, $msg = '', $count,$data = array()) {

        $result = array (
            'code' => $code,
            'msg' => $msg,
            'count'=>$count,
            'data' => $data
        );
        echo json_encode( $result,JSON_UNESCAPED_UNICODE);
    }

    function arrToJson($arr)
    {
        $json = "";
        foreach ($arr as $key => $value) {

            $json .= json_encode($value,JSON_UNESCAPED_UNICODE) . ',';
        }
        $json = stripcslashes($json);
        return '[' . substr($json,0,strlen($json) - 1) . ']';
    }

    /**
     * 对象转数组
     */
    function objectToArray($object){
        $temp = is_object($object) ? get_object_vars($object) : $object;

        $arr=array();
        foreach ($temp as $k => $v) {
            $v = (is_array($v) || is_object($v)) ? objectToArray($v) : $v;
            $arr[$k] = $v;
        }

        return $arr;
    }



     /**
     * 网页所在的服务器会返回一个包含HTTP状态码的信息头
     * 设置最大执行时间是 120秒,如果显示为200则正常,如果显示其它值表示不正常;$timeout后面的3是设置超时秒数。
     */
    // $check_web = array(
    // 'https://www.jb51.net/',
    // 'http://sc.jb51.net/',
    // 'http://tools.jb51.net/',
    // 'http://baike.jb51.net/',
    // 'http://demo.jb51.net/',
    // 'http://demo2.jb51.net/',
    // );
    // ini_set('max_execution_time',10);
    // for($i=0;$i<count($check_web);$i++){
    //   echo $check_web[$i].' -> '.httpcode($check_web[$i]).'<br>';
    // }
    function httpCode($url){
        $ch = curl_init();
        $timeout = 3;
        curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_HEADER, 1);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_exec($ch);
        return $httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
        curl_close($ch);
    }

    function gettime($filename){
        return "修改时间:".date("Y-m-d H:i:s",filemtime($filename))."\n"."创建时间:".date("Y-m-d H:i:s",filectime($filename));
    }
    function uCode($text){return mb_convert_encoding($text,'UTF-8','GBK');}//GBK字符串转换成UTF-8
    function gCode($text){return mb_convert_encoding($text,'GBK','UTF-8');}//UTF-8字符串转换成GBK


    function is_empty_dir($pathdir){
        $d=opendir($pathdir); 

        $i=0;  
        while($a=readdir($d)){  
            $i++;  
        }  
        closedir($d);  
        if($i>2){return false;}  
        else return true;  
    }


    //PHP检测SQL注入攻击代码,过滤注入
    function filter_injection(&$request)
    {
        $pattern = "/(select[\s])|(insert[\s])|(update[\s])|(delete[\s])|(from[\s])|(where[\s])|(truncate[\s])|(drop[\s])|(table[\s])|(grant[\s])|(load_file[\s])|(outfile[\s])/i";
        foreach($request as $k=>$v)
        {
            if(preg_match($pattern,$k,$match))
            {
                die("SQL Injection denied!");
            }

            if(is_array($v))
            {
                filter_injection($request[$k]);
            }
            else
            {
                if(preg_match($pattern,$v,$match))
                {
                    die("SQL Injection denied!");
                }
            }
        }
    }



    /**
     * 强制类型转换
     * @param string $data
     * @param string $type
     * @return mixed
     */
    function typeCast(&$data, $type)
    {
        switch (strtolower($type)) {
            // 数组
            case 'a':
                $data = (array) $data;
                break;
            // 数字
            case 'd':
                $data = (int) $data;
                break;
            // 浮点
            case 'f':
                $data = (float) $data;
                break;
            // 布尔
            case 'b':
                $data = (boolean) $data;
                break;
            // 字符串
            case 's':
            default:
                if (is_scalar($data)) {
                    $data = (string) $data;
                } else {
                    throw new InvalidArgumentException('variable type error:' . gettype($data));
                }
        }
    }


    /**
     * 过滤表单中的表达式
     * @param string $value
     * @return void
     */
    function filterExp(&$value)
    {
        // 过滤查询特殊字符
        if (is_string($value) && preg_match('/^(EXP|NEQ|GT|EGT|LT|ELT|OR|XOR|LIKE|NOTLIKE|NOT LIKE|NOT BETWEEN|NOTBETWEEN|BETWEEN|NOTIN|NOT IN|IN)$/i', $value)) {
            $value .= ' ';
        }
        // TODO 其他安全过滤
    }


    /**
     * 递归过滤给定的值
     * @param mixed     $value 键值
     * @param mixed     $key 键名
     * @param array     $filters 过滤方法+默认值
     * @return mixed
     */
    function filterValue(&$value, $key, $filters)
    {
        $default = array_pop($filters);
        foreach ($filters as $filter) {
            if (is_callable($filter)) {
                // 调用函数或者方法过滤
                $value = call_user_func($filter, $value);
            } elseif (is_scalar($value)) {
                if (false !== strpos($filter, '/')) {
                    // 正则过滤
                    if (!preg_match($filter, $value)) {
                        // 匹配不成功返回默认值
                        $value = $default;
                        break;
                    }
                } elseif (!empty($filter)) {
                    // filter函数不存在时, 则使用filter_var进行过滤
                    // filter为非整形值时, 调用filter_id取得过滤id
                    $value = filter_var($value, is_int($filter) ? $filter : filter_id($filter));
                    if (false === $value) {
                        $value = $default;
                        break;
                    }
                }
            }
        }
        return filterExp($value);
    }



    /**
     * 获取变量 支持过滤和默认值
     * @param array         $data 数据源
     * @param string|false  $name 字段名
     * @param mixed         $default 默认值
     * @param string|array  $filter 过滤函数
     * @return mixed
     */
    function input($data = [], $name = '', $default = null, $filter = '')
    {
        $name = (string) $name;

        if (is_array($data)) {
            array_walk_recursive($data, 'filterValue', $filter);
            reset($data);
        } else {
            filterValue($data, $name, $filter);
        }
        return $data;
    }

连接数据库

依赖的扩展

该mysql类依赖pdo和pdo_mysql两个扩展,缺少扩展会报Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in ....错误。

命令行运行php -m会列出所有php cli已安装的扩展,如果没有pdo 或者 pdo_mysql,请自行安装。

centos系统

PHP5.x

yum install php-pdo
yum install php-mysql

PHP7.x

yum install php70w-pdo_dblib.x86_64
yum install php70w-mysqlnd.x86_64

如果找不到包名,请尝试用yum search php mysql查找

ubuntu/debian系统

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

如果找不到包名,请尝试用apt-cache search php mysql查找

安装 Workerman/MySQL

方法1:

可以通过composer安装,命令行运行以下命令(composer源在国外,安装过程可能会非常慢)。

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer require workerman/mysql

上面命令成功后会生成vendor目录,然后在项目中引入vendor下的autoload.php。

require_once __DIR__ . '/vendor/autoload.php';

方法2:

下载源码,解压后的目录放到自己项目中(位置任意),直接require源文件。

require_once '/your/path/of/mysql-master/src/Connection.php';

具体MySQL/Connection用法

// 初始化db连接
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');

// 获取所有数据
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
//等价于
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
//等价于
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");

// 获取一行数据
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
//等价于
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
//等价于
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");

// 获取一列数据
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
//等价于
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
//等价于
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");

// 获取单个值
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
//等价于
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
//等价于
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");

// 复杂查询
$db->select('*')->from('table1')->innerJoin('table2','table1.uid = table2.uid')->where('age > :age')->groupBy(array('aid'))->having('foo="foo"')->orderByASC/*orderByDESC*/(array('did'))
->limit(10)->offset(20)->bindValues(array('age' => 13));
// 等价于
$db->query('SELECT * FROM `table1` INNER JOIN `table2` ON `table1`.`uid` = `table2`.`uid`
WHERE age > 13 GROUP BY aid HAVING foo="foo" ORDER BY did LIMIT 10 OFFSET 20');

// 插入
$insert_id = $db->insert('Persons')->cols(array(
    'Firstname'=>'abc',
    'Lastname'=>'efg',
    'Sex'=>'M',
    'Age'=>13))->query();
等价于
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");

// 更新
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// 等价于
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// 等价于
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");

// 删除
$row_count = $db->delete('Persons')->where('ID=9')->query();
// 等价于
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");

// 事务
$db->beginTrans();
....
$db->commitTrans(); // or $db->rollBackTrans();

webman/mysql快速开始

webman数据库默认采用的是 illuminate/database,也就是laravel的数据库,用法与laravel相同。

当然你可以参考使用其它数据库组件章节使用ThinkPHP或者其它数据库。

安装

composer require psr/container ^v1 illuminate/database illuminate/pagination illuminate/events

提示
如果不需要分页及数据库事件,则只需要执行
composer require psr/container ^v1 illuminate/database

数据库配置

config/database.php

return [
    // 默认数据库
    'default' => 'mysql',

    // 各种数据库配置
    'connections' => [
        'mysql' => [
            'driver'      => 'mysql',
            'host'        => '127.0.0.1',
            'port'        => 3306,
            'database'    => 'test',
            'username'    => 'root',
            'password'    => '',
            'unix_socket' => '',
            'charset'     => 'utf8',
            'collation'   => 'utf8_unicode_ci',
            'prefix'      => '',
            'strict'      => true,
            'engine'      => null,
        ],
    ],
];

使用

<?php
namespace app\controller;

use support\Request;
use support\Db;

class User
{
    public function db(Request $request)
    {
        $default_uid = 29;
        $uid = $request->get('uid', $default_uid);
        $name = Db::table('users')->where('uid', $uid)->value('username');
        return response("hello $name");
    }
}
文章目录