分类 Server 下的文章

  1. 当线程创建的时候,操作系统(OS)为每一个系统级(system-level)的线程分配栈。通常情况下,操作系统通过调用语言的运行时(runtime)去为应用程序分配堆。
  2. 栈附属于线程,因此当线程结束时栈被回收。堆通常通过运行时在应用程序启动时被分配,当应用程序(进程)退出时被回收。
  3. 当线程被创建的时候,设置栈的大小。在应用程序启动的时候,设置堆的大小,但是可以在需要的时候扩展(分配器向操作系统申请更多的内存)。
  4. 栈比堆要快,因为它存取模式使它可以轻松的分配和重新分配内存(指针/整型只是进行简单的递增或者递减运算),然而堆在分配和释放的时候有更多的复杂的 bookkeeping 参与。另外,在栈上的每个字节频繁的被复用也就意味着它可能映射到处理器缓存中,所以很快。

栈【Stack】:

a.和堆一样存储在计算机 RAM 中。
b.在栈上创建变量的时候会扩展,并且会自动回收。
c.相比堆而言在栈上分配要快的多。
d.用数据结构中的栈实现。
e.存储局部数据,返回地址,用做参数传递。
f.当用栈过多时可导致栈溢出(无穷次(大量的)的递归调用,或者大量的内存分配)。
g.在栈上的数据可以直接访问(不是非要使用指针访问)。
h.如果你在编译之前精确的知道你需要分配数据的大小并且不是太大的时候,可以使用栈。
i.当你程序启动时决定栈的容量上限。

堆【Heap】:

a.和栈一样存储在计算机RAM。
b.在堆上的变量必须要手动释放,不存在作用域的问题。数据可用 delete, delete[] 或者 free 来释放。
c.相比在栈上分配内存要慢。
d.通过程序按需分配。
e.大量的分配和释放可造成内存碎片。
f.在 C++ 中,在堆上创建数的据使用指针访问,用 new 或者 malloc 分配内存。
g.如果申请的缓冲区过大的话,可能申请失败。
h.在运行期间你不知道会需要多大的数据或者你需要分配大量的内存的时候,建议你使用堆。
i.可能造成内存泄露。


stream_bucket_append函数:为队列添加数据 
stream_bucket_make_writeable函数:从操作的队列中返回一个数据对象
stream_bucket_new函数:为当前队列创建一个新的数据
stream_bucket_prepend函数:预备数据到队列 
stream_context_create函数:创建数据流上下文
stream_context_get_default函数:获取默认的数据流上下文
stream_context_get_options函数:获取数据流的设置
stream_context_set_option函数:对数据流、数据包或者上下文进行设置
stream_context_set_params函数:为数据流、数据包或者上下文设置参数
stream_copy_to_stream函数:在数据流之间进行复制操作
stream_filter_append函数:为数据流添加过滤器
stream_filter_prepend函数:为数据流预备添加过滤器
stream_filter_register函数:注册一个数据流的过滤器并作为PHP类执行
stream_filter_remove函数:从一个数据流中移除过滤器
stream_get_contents函数:读取数据流中的剩余数据到字符串
stream_get_filters函数:返回已经注册的数据流过滤器列表
stream_get_line函数:按照给定的定界符从数据流资源中获取行
stream_get_meta_data函数:从封装协议文件指针中获取报头/元数据
stream_get_transports函数:返回注册的Socket传输列表
stream_get_wrappers函数:返回注册的数据流列表
stream_register_wrapper函数:注册一个用PHP类实现的URL封装协议
stream_select函数:接收数据流数组并等待它们状态的改变
stream_set_blocking函数:将一个数据流设置为堵塞或者非堵塞状态
stream_set_timeout函数:对数据流进行超时设置
stream_set_write_buffer函数:为数据流设置缓冲区
stream_socket_accept函数:接受由函数stream_ socket_server()创建的Socket连接
stream_socket_client函数:打开网络或者UNIX主机的Socket连接
stream_socket_enable_crypto函数:为一个已经连接的Socket打开或者关闭数据加密
stream_socket_get_name函数:获取本地或者网络Socket的名称
stream_socket_pair函数:创建两个无区别的Socket数据流连接
stream_socket_recvfrom函数:从Socket获取数据,不管其连接与否
stream_socket_sendto函数:向Socket发送数据,不管其连接与否
stream_socket_server函数:创建一个网络或者UNIX Socket服务端
stream_wrapper_restore函数:恢复一个事先注销的数据包
stream_wrapper_unregister函数:注销一个URL地址包


代码

#include <stdio.h>

int main(void)
{
    int urn[5] = {100,200,300,400,500};
    int *ptr1, *ptr2, *ptr3;
    
    ptr1 = urn; //第1个元素地址0x00007ffeefbff470
    ptr2 = &urn[2];  //第3个元素地址0x00007ffeefbff478
    
    printf("ptr1 = %p, *ptr1 = %d, &ptr1 = %p\n", ptr1, *ptr1, &ptr1); //ptr1表示第1个元素地址470  第1个元素值100  表示变量ptr1本身的地址460
    
    ptr3 = ptr1 + 4; //批针与整数和相加意思是,整数与指针指向的类型的字节数相乘 再与初始地址相加(16进制)
    printf("ptr1+4 = %p, *(ptr1+4) = %d\n", ptr1 + 4, *(ptr1 + 4)); //500的地址480  值500  (4*4=16位)
    
    ptr1++; //自增指针,意思是指针移至下一个元素
    printf("ptr1 = %p, *ptrl = %d, &ptr1 =  %p\n", ptr1, *ptr1, &ptr1); //200的地址474  200  prt1指针变量自身的地址460
    
    ptr2--;  //先获取地址再减
    printf("ptr2 = %p, *ptr2 = %d, &ptr2 = %p\n", ptr2, *ptr2, &ptr2); //474   200     ptr2变量自身的变量地址458
    
    --ptr1;
    ++ptr2;
    printf("ptr1 = %p, ptr2 = %p\n", ptr1, ptr2); //470    478
    printf("ptr2 = %p, ptr1 = %p, ptr2 - ptr1 = %td\n", ptr2, ptr1, ptr2 - ptr1); //478  470  2(表示2个整形类型的字节)
    printf("ptr3 = %p, ptr3 - 2 = %p\n", ptr3, ptr3 - 2); //480  478
    
    return 0;
}

结果

ptr1 = 0x7ffeefbff470, *ptr1 = 100, &ptr1 = 0x7ffeefbff460
ptr1+4 = 0x7ffeefbff480, *(ptr1+4) = 500
ptr1 = 0x7ffeefbff474, *ptrl = 200, &ptr1 =  0x7ffeefbff460
ptr2 = 0x7ffeefbff474, *ptr2 = 200, &ptr2 = 0x7ffeefbff458
ptr1 = 0x7ffeefbff470, ptr2 = 0x7ffeefbff478
ptr2 = 0x7ffeefbff478, ptr1 = 0x7ffeefbff470, ptr2 - ptr1 = 2
ptr3 = 0x7ffeefbff480, ptr3 - 2 = 0x7ffeefbff478
Program ended with exit code: 0

Xcode10.2与macOS运行

PHP Fileinfo extension must be installed/enabled to use Intervention Image.

必须安装扩展 fileInfo切记。
安装扩展 opcache切记。
php_fileinfo, php_mbstring, php_openssl,
删除被禁用的proc_open函数。

备份设置:
'dump_binary_path' => '/usr/bin/', //BT宝塔
'dump_binary_path' => 'D:\phpstudyV81\Extensions\MySQL5.7.26\bin', //win

权限目录:
chmod -R 777 bootstrap/
chmod -R 777 storage/
chmod -R 777 public/

Linux:
whereis mysql 查询mysql路径。

参考:https://www.jianshu.com/p/c692761bbd0d

QQ20211103-213502@2x.png

以上这些都很非常优秀。

Window —— HeidiSQL
Mac —— Sequel Ace(Sequel Pro 的升级版)
跨平台: —— TablePlus

本文转自:https://learnku.com/articles/62269 感谢作者的付出!!

products商品表

字段名称 描述 类型 加索引缘由
id 自增长ID unsigned big int 主键
title SKU 名称 varchar
description SKU 描述 varchar
price SKU 价格 decimal
stock 库存 unsigne int
product_id 所属商品 id unsigne big int 外键

orders订单表

字段名称 描述 类型 加索引缘由
id 自增长ID unsigned big int 主键
no 订单流水号 varchar 唯一
user_id 下单的用户ID unsigned big int 外键
address JSON格式的收货地址 text
total_amount 订单总金额 decimal
remark 订单备注 text
paid_at 支付时间 datetime, null
payment_method 支付方式 varchar, null
payment_no 支付平台订单号 varchar, null
refund_status 退款状态 varchar
refund_no 退款单号 varchar, null 唯一
closed 订单是否已关闭 tinyint, default 0
reviewed 订单是否已评价 tinyint, default 0
ship_status 物流状态 varchar
ship_data 物流数据 text, null
extra 其他额外的数据 text, null

order_sku 订单项目名

字段名称 描述 类型 加索引缘由
id 自增长ID unsigned big int 主键
order_id 所属订单ID unsigned big int 外键
product_id 对应商品ID unsigned big int 外键
product_sku_id 对应商品SKU ID unsigned big int 外键
amount 数量 unsigned int
price 单价 decimal
rating 用户打分 unsigned int, null
review 用户评价 text
reviewed_at 评价时间 timestamp, null