workerman,webman相关框架
官网首页: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 字符会被替换为 < 和 > 。这样可防止攻击者通过在表单中注入 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");
}
}
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。