Composer
列出安装的包并筛选
composer show -i | grep hyperf查看全局安装的包
composer global show查看安装的包
composer showcomposer 安装报内存不足
执行安装
php -d memory_limit=-1 `which composer` install -vvv执行更新
php -d memory_limit=-1 `which composer` update -vvv composer show -i | grep hyperfcomposer global showcomposer showphp -d memory_limit=-1 `which composer` install -vvvphp -d memory_limit=-1 `which composer` update -vvv !defined('BASE_PATH') && define('BASE_PATH', dirname(__DIR__, 1));
define('CACHE_PATH', BASE_PATH . '/runtime/cache');
define('RESOURCE_PATH', BASE_PATH . '/resource');
// 九宫格切图且添加文字
imageSlicing9($imgPath, $fonts = [], $fontPath = null)
{
list($width, $height) = getimagesize($imgPath);
$source = imagecreatefromjpeg($imgPath);
$width = $width - $width % 3;
$height = $height - $height % 3;
$baseWidth = $width / 3;
$baseHeight = $height / 3;;
$imgPathMd5 = md5($imgPath);
$results = [];
foreach ([
[0, 0],
[$baseWidth, 0],
[$baseWidth * 2, 0],
[0, $baseHeight],
[$baseWidth, $baseHeight],
[$baseWidth * 2, $baseHeight],
[0, $baseHeight * 2],
[$baseWidth, $baseHeight * 2],
[$baseWidth * 2, $baseHeight * 2],
] as $key => $item) {
$thumb = ImageCreateTrueColor($baseWidth, $baseHeight);
imagecopyresized($thumb, $source, 0, 0, $item[0], $item[1], $baseWidth, $baseHeight, $baseWidth, $baseHeight);
if (!empty($fonts[$key])) {
$fontCount = mb_strlen($fonts[$key], 'utf-8');
$black = imagecolorallocate($thumb, 0, 0, 0);//字体颜色 RGB
$fontSize = 12; //字体大小
$circleSize = 0; //旋转角度
$left = 5;
$right = 5;
$fonttIndex = 0;
$fontList = [];
$fonttRowWidth = $baseWidth - $left - $right;
$fontList[$fonttIndex] = '';
$fontListWidth[$fonttIndex] = 0;
$fonttHeight = $fontSize;
for ($iii = 0; $iii < $fontCount; $iii++) {
$fontt = mb_substr($fonts[$key], $iii, 1, 'utf-8');
$pos = imagettfbbox($fontSize, 0, $fontPath, $fontt);
$fonttWidth = $pos[2] - $pos[0];
$fonttHeight = $pos[3] - $pos[5];
// 计算剩余宽度, 如果够, 那么就挤进去, 否则下一排
if (($fonttRowWidth = $fonttRowWidth - $fonttWidth) > 0) {
$fontList[$fonttIndex] .= $fontt;
$fontListWidth[$fonttIndex] += $fonttWidth;
} else {
$fonttRowWidth = $baseWidth - $left - $right - $fonttWidth;
$fonttIndex++;
$fontList[$fonttIndex] = $fontt;
$fontListWidth[$fonttIndex] = $fonttWidth;
}
}
$top = $baseHeight - ($fonttHeight + 5) * count($fontList) + 5;
if ($top < 0) {
$top = 10;
}
if (count($fontList) == 1) {
$left = intval(($baseWidth - $fontListWidth[0]) / 2);
}
foreach ($fontList as $fontvalue) {
imagefttext($thumb, $fontSize, $circleSize, $left, $top, $black, $fontPath, $fontvalue);
$top = $top + $fonttHeight + 5;
}
/*
$widthFonts = intval($baseWidth / ($fontSize * 1.4)); // 一排显示的文字数量
$rows = ceil($fontCount / $widthFonts);
$top = $baseHeight - ($fontSize + 5) * $rows;
if ($top < 0) {
$top = 0;
}
for ($ii = 1; $ii <= $rows; $ii++) {
// $fontItem = substr($fonts[$key], ($ii - 1) * $widthFonts, $widthFonts);
$fontItem = mb_substr($fonts[$key], ($ii - 1) * $widthFonts, $widthFonts, 'utf-8');
if (!empty($fontItem)) {
var_dump([$left, $top, $fontItem]);
imagefttext($thumb, $fontSize, $circleSize, $left, $top, $black, $fontPath, $fontItem);
}
$top = $top + $fontSize + 5;
}
*/
}
imagejpeg($thumb, $results[] = CACHE_PATH . "/" . $imgPathMd5 . "{$key}.jpg", 100);
}
return $results;
}$imgPath = BASE_PATH . '/runtime/cache/timg.jpg';
$fontPath = RESOURCE_PATH . '/fonts/方正黑体简体.TTF';//字体,字体文件需保存到相应文件夹下
$fonts = ["啊1","啊2","啊3","啊4","啊5","啊6","啊7","啊8","啊9",]
$pp = imageSlicing9($imgPath, $fonts, $fontPath);
var_dump($pp); 网上找的答案
https://www.cnblogs.com/doseoer/p/10325596.html
官方文档
https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlocks-handling.html
前端反馈测服偶尔出现这个错误
参考了网上很多答案, 很多人说把配置文件里面的localhost改为127.0.0.1就可以了, 也许吧 if (!function_exists('model_where')) {
function model_where(&$model, $where)
{
if (empty($where)) {
return $model;
}
// 使用表结构分析, 自动将传进来的参数根据分析的表结构来决定查询条件
$tableInfo = $model::DB()->select('SHOW FULL FIELDS FROM `' . $model->getTable() . '`');
$tableInfo = object_to_array($tableInfo);
$tableInfo = array_column_to_key($tableInfo, 'Field');
$model = $model::query();
foreach ($tableInfo as $key => $v) {
if (strpos($tableInfo[$key]['Type'], 'int') !== false) {
if (array_key_exists($key, $where) && is_numeric($where[$key])) {
$model = $model->where($key, intval($where[$key]));
}
} else if (strpos($tableInfo[$key]['Type'], 'char') !== false) {
if (!empty($where[$key])) {
$model = $model->where($key, 'like', '%' . $where[$key] . '%');
}
} else if (
strpos($tableInfo[$key]['Type'], 'decimal') !== false
|| strpos($tableInfo[$key]['Type'], 'timestamp') !== false
) {
if (array_key_exists($key . '_from', $where) && $where[$key . '_from'] !== '') {
$model = $model->where($key, '>=', $where[$key . '_from']);
}
if (array_key_exists($key . '_to', $where) && $where[$key . '_to'] !== '') {
$model = $model->where($key, '<', $where[$key . '_to']);
}
if (array_key_exists($key, $where) && $where[$key] !== '') {
$model = $model->where($key, $where[$key]);
}
} else if (strpos($tableInfo[$key]['Type'], 'enum') !== false) {
if (array_key_exists($key, $where)) {
$model = $model->where($key, $where[$key]);
}
}
}
}
}
$where = RequestHelper::get();
$query = new AbcdModel()
model_where($query,$where);
return ResponseHelper::paginator($query->paginate(RequestHelper::getPerPage()), new \App\Transformers\AbcdModelTransformer());if (!function_exists('sql_insert_once')) {
// 写入限制, 确保写入只会被写入一次
function model_sql_insert_once($table, $array, $existsSql = '')
{
$sql0 = [];
$sql1 = [];
foreach ($array as $kq => $kv) {
$sql0[] = '`' . $kq . '`';
if (is_null($kv)) {
$sql1[] = 'NULL';
} else {
$sql1[] = '\'' . addslashes($kv) . '\'';
}
}
// SELECT * FROM `' . $table . '` WHERE AND created_at>NOW()-INTERVAL 5 SECOND
return ' INSERT INTO `' . $table . '`(' . implode(',', $sql0) . ')
SELECT ' . implode(',', $sql1) . ' FROM DUAL WHERE NOT EXISTS(' . $existsSql . ') ';
/*
DB::insert(DB::raw($tmpSql));
$paymentParentId = DB::getPdo()->lastInsertId();
if (empty($paymentParentId)) {
error_responses('支付中 ...');
}
*/
}
}$sql = model_sql_insert_once('course_orders', $courseOrderHeader, "SELECT * FROM course_orders WHERE
help_code='" . $courseOrderHeader['help_code'] . "'
AND pid='" . $courseOrderHeader['pid'] . "'
AND class_id='" . $courseOrderHeader['class_id'] . "'
AND course_id='" . $courseOrderHeader['course_id'] . "'
AND state=1
AND created_at>NOW()-INTERVAL 60 SECOND");
// DB::insert(DB::raw($sql)) ;
$db = CourseOrderItem::DB();
$db->beginTransaction();
$db->insert($sql);
$orderId = DB::getPdo()->lastInsertId();
if (empty($orderId)){
error_response('下单中');
} 针对delete操作, 常常会慢的严重, 明明查询出来需要删除的记录才70多条, 执行一次都得1分多钟
delete from course_orders
where
pid=1
AND state=1
AND created_at<date_sub(now(),interval 7 DAY)
AND id IN (
SELECT max_order_id FROM (
SELECT use_uid,course_id,COUNT(1) AS num,MAX(order_id) AS max_order_id FROM `course_order_items`
WHERE
pid=1
AND state=0
AND created_at>'2020-01-01'
GROUP BY use_uid,course_id
) a
WHERE num>1
)
共 73 行受到影响
执行耗时 : 59.794 sec
传送时间 : 0.001 sec
总耗时 : 59.796 secdelete co from course_orders co inner join (
SELECT max_order_id FROM (
SELECT use_uid,course_id,COUNT(1) AS num,MAX(order_id) AS max_order_id FROM `course_order_items`
WHERE
pid=1
AND state=0
AND created_at>'2020-01-01'
GROUP BY use_uid,course_id
) a
WHERE num>1
) bb on pid=1
AND state=1
AND created_at<date_sub(now(),interval 7 DAY)
AND co.id=bb.max_order_id
执行结果
共 73 行受到影响
执行耗时 : 0.066 sec
传送时间 : 0.008 sec
总耗时 : 0.075 sec