用PHP+CI写的后台,现在要加一个需求,
把每个用户当月的发奖次数统计,然后下个月重置再从0开始计算,请问这个的实现逻辑是什么。
或者说PHP 有办法写这种定时重置的方法吗
没有足够的数据
(゚∀゚ )
暂时没有任何数据
(゚∀゚ )
暂时没有任何数据
呀呀呀 提出了问题 · 4月6日
用PHP+CI写的后台,现在要加一个需求,
把每个用户当月的发奖次数统计,然后下个月重置再从0开始计算,请问这个的实现逻辑是什么。
或者说PHP 有办法写这种定时重置的方法吗
用PHP+CI写的后台,现在要加一个需求,把每个用户当月的发奖次数统计,然后下个月重置再从0开始计算,请问这个的实现逻辑是什么。或者说PHP 有办法写这种定时重置的方法吗
关注 3 回答 2
呀呀呀 提出了问题 · 3月13日
这四个选择框,第一个框分为首页和国家,想法是选择首页就显示3,4两个选择框 第二个就隐藏。
选择国家就只显示第2个选择框,平时默认就是显示1,3,4这三个框。
下面附上前端代码
<div class="layui-form-item">
<label class="layui-form-label">所属分类</label>
<div class="layui-input-inline" id="country" style="width:250px;">
<select name="model" lay-verify=" " lay-search>
<option value="0">首页</option>
<option value="1">国家页</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">选择国家</label>
<div class="layui-input-inline">
<?php if($data['act'] == 'edit'):?>
<select name="one" lay-filter="seltest" lay-search disabled>
<option value="">编辑时不选择</option>
</select>
<?php else:?>
<select name="country" lay-filter="seltest" lay-search >
<option value="">选择所属国家</option>
<?php foreach ($country['data'] as $key => $val):?>
<option value="<?php echo $val['id']; ?>" ><?php echo $val['name']; ?></option>
<?php endforeach;?>
</select>
<?php endif;?>
</div>
</div>
这四个选择框,第一个框分为首页和国家,想法是选择首页就显示3,4两个选择框 第二个就隐藏。选择国家就只显示第2个选择框,平时默认就是显示1,3,4这三个框。
关注 4 回答 3
呀呀呀 收藏了文章 · 3月13日
PS:本文就是用于回答我朋友的问题【本文以渣男角度陈述】
重型:是指php 可执行文件运行后,会调用大量的文件操作函数【如open,read等】读取大量的php文本文件【只不过老实人喜欢叫php源码文件,并且老实人喜欢重型脚本称为框架】
【本文不按套路陈述用法也不讲用法,不适合小白,本文只是传达一个标题的概念】
本文的环境:linux+php+nginx 其它没有了【本人是渣男,不会遵守任何官方相应条款】
【本文需要你看完以自己去架着轰炸机去测试php-fpm】
安装流程
1 去这里下载 【当然你老实本份就composer create-project laravel/laravel,我是渣男不老实,听说人家不喜欢老实人】
2 安装
它安装时会读取composer.json等文件去下载类库文件,所以你如果安装时遇到各种问题,可以修改composer.json决定要装什么东西,人家说php版本必须是高版本才能装laravel8【这一般是老实的人才会遵守的条款,我是渣男,肯定不会遵守老外的条款】
3 然后瞎配置一下nginx[它会把数据发给php]
4 启动服务
nginx只是转发请求给php-fpm处理而已,毕竟这是老传统了,当你愿意遵守这个传统条款时。
5 然后我先老实的访问一下
6 以上是老实做法,下面我们根据提示调整参数
这些配置参数不用记,记来干什么?用来面试别人?真是老实人。
然后重启服务 ,再来老实的访问
然后出现这种,一般这种情况老实人就比较紧张了,怕人家强暴一样的紧张。我们现在看一下php-fpm进程执行的情况
上面图中我圈出的就是重点,你硬是看不懂,我没有办法了。 要不599找我手把手教你吧。^_^
接下来根据它的提示调整一下
我们调整好以后,再访问
这个时候你也别紧张兮兮,我们看一下php-fpm运行laravel的情况再说话,不要像怨妇一样上来就是啊,怎么办?
我们看到这php-fpm在运行laravel时,打开的脚本文件那是相当多,我这里只是截图部分,为了处理一个小小的访问,它打开一堆脚本文件,后面它直接去访问500这个文件了。很不给面子。
7 接下来,我们一步步的看一下我运行,php-fpm为了处理这个重型框架到底加载了多少php脚本文件【部分截图】【自己用电脑看,不要用小的可怜兮兮的手机看,渣男就应该用PC看】
路由注册服务
Kernel 核心文件
好了,我们不是要研究框架的运行机制,我们现在先看一下500报错页面的加载
大家可以看到,一个小小的业务需求,它就加载一大堆的【open,read,lstat,close文件,这些操作都是要去磁盘里读取,框架越重,php-fpm处理时间越长,当然了php-fpm本身是个守护进程,接收一次tcp连接和数据传输后,它就断开了】在这里大家可以自行的进行测试,从框架的index.php到最后输出,打开了N个文件,都是要操作磁盘,读取的数据当然是要占用内存,c会申请一堆内存再去处理这些脚本的语法,进行解析。
8 下面随便给你们看下问题所在
看一下它写的内容就知道问题在哪里了
write(4, "[2021-01-29 10:47:15] production.ERROR: No application encryption key has been specified. {"exception":"[object] (I
这句话看不懂,那就比较老火了。
你们有兴趣就去看一下它的加密注册服务代码
解决一下
我不老实,不按上面解决,按渣男方式解决
再访问时
手动写一个
下面测试一下
改成这吊样
请求过程
最后一把
//请求
路由注册
控制器调度
响应
php-fpm和nginx运行时系统调用情况【响应北风之神内容的分析】
【统计误差很小,大家可以自行统计】
1 系统调用时产生的记录日志大小
php-fpm运行时的系统调用产生:1.4M
ngninx:1.5M
open 打开php脚本文件次数
open 打开php脚本后read读取脚本内容次数
read php脚本时大概读取多少个字节
根据公式换算一下:
1M=1024KB
1KB=1024Byte
1M=1024*1024=1000,000
1362477=1330KB=1M
php-fpm响应给nginx字节数
nginx响应给用户的字节数
PS:本文就是用于回答我朋友的问题【本文以渣男角度陈述】 重型:是指php 可执行文件运行后,会调用大量的文件操作函数【如open,read等】读取大量的php文本文件【只不过老实人喜欢叫php源码文件,并且老实人喜欢重型脚本称为框架】 【本文不按套路陈述用法也不讲用法,...
呀呀呀 赞了文章 · 3月13日
PS:本文就是用于回答我朋友的问题【本文以渣男角度陈述】
重型:是指php 可执行文件运行后,会调用大量的文件操作函数【如open,read等】读取大量的php文本文件【只不过老实人喜欢叫php源码文件,并且老实人喜欢重型脚本称为框架】
【本文不按套路陈述用法也不讲用法,不适合小白,本文只是传达一个标题的概念】
本文的环境:linux+php+nginx 其它没有了【本人是渣男,不会遵守任何官方相应条款】
【本文需要你看完以自己去架着轰炸机去测试php-fpm】
安装流程
1 去这里下载 【当然你老实本份就composer create-project laravel/laravel,我是渣男不老实,听说人家不喜欢老实人】
2 安装
它安装时会读取composer.json等文件去下载类库文件,所以你如果安装时遇到各种问题,可以修改composer.json决定要装什么东西,人家说php版本必须是高版本才能装laravel8【这一般是老实的人才会遵守的条款,我是渣男,肯定不会遵守老外的条款】
3 然后瞎配置一下nginx[它会把数据发给php]
4 启动服务
nginx只是转发请求给php-fpm处理而已,毕竟这是老传统了,当你愿意遵守这个传统条款时。
5 然后我先老实的访问一下
6 以上是老实做法,下面我们根据提示调整参数
这些配置参数不用记,记来干什么?用来面试别人?真是老实人。
然后重启服务 ,再来老实的访问
然后出现这种,一般这种情况老实人就比较紧张了,怕人家强暴一样的紧张。我们现在看一下php-fpm进程执行的情况
上面图中我圈出的就是重点,你硬是看不懂,我没有办法了。 要不599找我手把手教你吧。^_^
接下来根据它的提示调整一下
我们调整好以后,再访问
这个时候你也别紧张兮兮,我们看一下php-fpm运行laravel的情况再说话,不要像怨妇一样上来就是啊,怎么办?
我们看到这php-fpm在运行laravel时,打开的脚本文件那是相当多,我这里只是截图部分,为了处理一个小小的访问,它打开一堆脚本文件,后面它直接去访问500这个文件了。很不给面子。
7 接下来,我们一步步的看一下我运行,php-fpm为了处理这个重型框架到底加载了多少php脚本文件【部分截图】【自己用电脑看,不要用小的可怜兮兮的手机看,渣男就应该用PC看】
路由注册服务
Kernel 核心文件
好了,我们不是要研究框架的运行机制,我们现在先看一下500报错页面的加载
大家可以看到,一个小小的业务需求,它就加载一大堆的【open,read,lstat,close文件,这些操作都是要去磁盘里读取,框架越重,php-fpm处理时间越长,当然了php-fpm本身是个守护进程,接收一次tcp连接和数据传输后,它就断开了】在这里大家可以自行的进行测试,从框架的index.php到最后输出,打开了N个文件,都是要操作磁盘,读取的数据当然是要占用内存,c会申请一堆内存再去处理这些脚本的语法,进行解析。
8 下面随便给你们看下问题所在
看一下它写的内容就知道问题在哪里了
write(4, "[2021-01-29 10:47:15] production.ERROR: No application encryption key has been specified. {"exception":"[object] (I
这句话看不懂,那就比较老火了。
你们有兴趣就去看一下它的加密注册服务代码
解决一下
我不老实,不按上面解决,按渣男方式解决
再访问时
手动写一个
下面测试一下
改成这吊样
请求过程
最后一把
//请求
路由注册
控制器调度
响应
php-fpm和nginx运行时系统调用情况【响应北风之神内容的分析】
【统计误差很小,大家可以自行统计】
1 系统调用时产生的记录日志大小
php-fpm运行时的系统调用产生:1.4M
ngninx:1.5M
open 打开php脚本文件次数
open 打开php脚本后read读取脚本内容次数
read php脚本时大概读取多少个字节
根据公式换算一下:
1M=1024KB
1KB=1024Byte
1M=1024*1024=1000,000
1362477=1330KB=1M
php-fpm响应给nginx字节数
nginx响应给用户的字节数
PS:本文就是用于回答我朋友的问题【本文以渣男角度陈述】 重型:是指php 可执行文件运行后,会调用大量的文件操作函数【如open,read等】读取大量的php文本文件【只不过老实人喜欢叫php源码文件,并且老实人喜欢重型脚本称为框架】 【本文不按套路陈述用法也不讲用法,...
赞 1 收藏 1 评论 0
呀呀呀 收藏了文章 · 3月13日
**高以下为基,贵以贱为本
互联网技术的核心根基就是TCP/IP,TCP/IP的实现依赖于Linux socket API【我们的项目大部分运行在上面】
没有它们各种高大上牛逼的技术就无从建立起来。而这根基对大家所用的java,go,py,php,c,c++,nodejs...都是一样的,只不过是基于Linux api做了各种各样的封装百家争鸣,百花齐放,跟易经里的阴阳构成64卦一样,当你刚开始撸程序时,可能并不会觉得基础的重要性,甚至可能几年内一直是框架crud boy,你并不会察觉到基础核心Linux socket api【一般来说linux内核的api很少变动,比较稳定,国内linux内核开发工程师估计也不会天天没事干,天天修改linux内核api】!
每天被各种新技术词汇遮蔽双眼,而基础知识你一直的错失和鄙视低估,就想一步飞龙在天,达到九五爻之位,并没有“以下为基” “以贱为本” **
甚至对于其它知识点你都持“下贱之态”只想与天齐名,从不脚踏实地从坤做起。
先给总结图 你再看下面的内容
下面就是要告诉你所谓的牛逼技术到底是什么回事!!!
我们测试一下数据库,java,python,go,c/c++,php,redis,docker进行测试【测完你会发现点东西】
然后你再看图比较好
好启动了,没有什么可说的,ELF文件启动。
.ibd是创建数据表时生成的文件,没啥可说的,DBA专业都知道
我画线的地方调用了ACCEPT SOCKET API函数
调用了SENDTO,RECVFROM SOCKET API 函数
mysql怎么实现我们管不着,但是数据来回的传输依赖于LINUX SOCKET API,这些都是网络接口API
调用了系统其它API函数库,我们看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相关函数
启动redis
测试
**epoll_wait 得到就绪的文件描述符读事件返回,然后调用read,其实跟RECVFROM功能一样
它的数据是:3rn$3rnsetrn4rnbfzsrn5rn10000rn
这一堆数据被各种大佬称为 redis的二进制通信请求协议!!!返回是+OKrn**
它们的数据来回传输大部分用read,write函数来实现
dockerd服务ELF文件调用的linux api相关函数库
启动docker服务,跟mysql一样默认启动一堆进程和线程
相关命令运行【对不起,我不喜欢背东西,你要是面试我时,问我docker有哪些命令选项,对不起我回家种地放牛了】
来用下测试
运行过程
都在调用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函数
docker调用的LINUX API 函数库
我直接复制粘粘给你运行对不起我背不了函数,要用就直接复制粘粘就好了
go ELF 文件
来运行那个大家认为的源码文件
先运行哪个函数,你自己看着办哦
重点
熟悉的一批,socket 创建socket文件描述符,然后命名【把ip,端口绑定到此文件上】,然后监听,并阻塞在accept函数上
好了,go就这样子,它封装的比较骚,go elf编译器封装的牛逼,语法换了一套就称为编译型语言了。
py的语法就是好,随便一撸就可以了,简直是粗暴又骚,语法嘛就这样,长得跟少妇一样
来先认识一下python elf文件 毕竟好多爬虫大佬可能没有见过
.php .py .go .java里的东西只是个文本内容,你们嘛叫源码,我没有文化,只能叫ascii text ^_^
启动测试
有没有发现,熟悉的一批
好了,到这里够意思了。
这么简单的语言,你去学语法就行了,简单又粗暴谁不喜欢呢。我都喜欢。 ^_^
测试源码
cat GreetingServer.java
import java.net.*;
import java.io.*;
public class GreetingServer extends Thread
{
private ServerSocket serverSocket;
public GreetingServer(int port) throws IOException
{
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(100000000);
}
public void run()
{
while(true)
{
try
{
System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
server.close();
}catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
public static void main(String [] args)
{
int port = Integer.parseInt(args[0]);
try
{
Thread t = new GreetingServer(port);
t.run();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
看一下java elf文件,我相信java大佬肯定知道我就不费话了
编译一下
我没有学过java,但是看一下报错就知道了,对不对,这么明显的提示,我phper都晓得 ^_^
编译ok
编译好是啥文件
启动java程序开始测试
有没有发现,熟悉的一批
好了,就这么多就行了,没有必要再截图了。
看接下,我们撸c[c++一样]
你们应该看出点熟悉的地方了
int main(int argc,char *argv[])
{
if(argc<=2){
printf("useage:%s ip_address port_number\n",basename(argv[0]));
return 1;
}
const char *ip = argv[1];
int port = atoi(argv[2]);
int ret = 0;
struct sockaddr_in address;
bzero(&address,sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port = htons(port);
int listenfd = socket(PF_INET,SOCK_STREAM,0);
assert(listenfd>=0);
ret = bind(listenfd,(struct sockaddr*)&address,sizeof(address));
assert(ret!=-1);
ret = listen(listenfd,5);
assert(ret!=-1);
bzero(&address,sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port = htons(port);
int udpfd = socket(PF_INET,SOCK_DGRAM,0);
assert(udpfd>=0);
ret = bind(udpfd,(struct sockaddr*)&address,sizeof(address));
assert(ret!=-1);
struct epoll_event events[MAX_EVENT_NUMBER];
int epollfd = epoll_create(5);
assert(epollfd!=-1);
addfd(epollfd,listenfd);
addfd(epollfd,udpfd);
while(1){
int number = epoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1);
if(number<0){
printf("epoll failre\n");
break;
}
for(int i=0;i<number;i++){
int sockfd = events[i].data.fd;
if(sockfd ==listenfd){
struct sockaddr_in client_address;
socklen_t client_addrlength = sizeof(client_address);
int connfd = accept(listenfd,(struct sockaddr*)&client_address,&client_addrlength);
addfd(epollfd,connfd);
}
else if(sockfd == udpfd){
char buf[UDP_BUFFER_SIZE];
memset(buf,0,UDP_BUFFER_SIZE);
struct sockaddr_in client_address;
socklen_t client_addrlength = sizeof(client_address);
ret = recvfrom(udpfd,buf,UDP_BUFFER_SIZE-1,0,(struct sockaddr*)&client_address,&client_addrlength);
if(ret>0){
sendto(udpfd,buf,UDP_BUFFER_SIZE-1,0,(struct sockaddr*)&client_address,client_addrlength);
}
}
else if(events[i].events & EPOLLIN){
char buf[TCP_BUFFER_SIZE];
while(1){
memset(buf,0,TCP_BUFFER_SIZE);
ret = recv(sockfd,buf,TCP_BUFFER_SIZE-1,0);
if(ret<0){
if((errno==EAGAIN)||(errno=EWOULDBLOCK)){
break;
}
close(sockfd);
break;
}
else if(ret==0){
close(sockfd);
}
else{
send(sockfd,buf,ret,0);
}
}
}else{
printf("something else happened\n");
}
}
}
close(listenfd);
return 0;
}
然后编译,编译好就这样
测试
好了,都不用我废话了,接下来还是测试下php吧,我觉得,虽然有的朋友觉得php咋样咋样,拍黄片嘛,在打黄打非的压力之下当然没啥好名声了。
看下php elf文件
启动并测试跟踪
好了,不用我废话,大家也知道是怎么回事了。
这些api函数怎么用呢?
man socket
linux socket api 是所有语言,数据库等应用的核心低层技术知识,你框架掌握的再6,没有多少意义,语言掌握得再6也只是工具
分布式,集群,高大上的技术都要TCP/IP支持,而它的实现就是网络编程,各语言写法不同,但是核心基础知识没有变化,正所谓天下大事必作于细天下难事必作于易,一上来撸c/c++,java如果不合适你,那么上来就撸PHP掌握了共通的知识再换语言又何妨呢?
**高以下为基,贵以贱为本 互联网技术的核心根基就是TCP/IP,TCP/IP的实现依赖于Linux socket API【我们的项目大部分运行在上面】没有它们各种高大上牛逼的技术就无从建立起来。而这根基对大家所用的java,go,py,php,c,c++,nodejs...都是一样的,只不过是基于Linux api...
呀呀呀 赞了文章 · 3月13日
**高以下为基,贵以贱为本
互联网技术的核心根基就是TCP/IP,TCP/IP的实现依赖于Linux socket API【我们的项目大部分运行在上面】
没有它们各种高大上牛逼的技术就无从建立起来。而这根基对大家所用的java,go,py,php,c,c++,nodejs...都是一样的,只不过是基于Linux api做了各种各样的封装百家争鸣,百花齐放,跟易经里的阴阳构成64卦一样,当你刚开始撸程序时,可能并不会觉得基础的重要性,甚至可能几年内一直是框架crud boy,你并不会察觉到基础核心Linux socket api【一般来说linux内核的api很少变动,比较稳定,国内linux内核开发工程师估计也不会天天没事干,天天修改linux内核api】!
每天被各种新技术词汇遮蔽双眼,而基础知识你一直的错失和鄙视低估,就想一步飞龙在天,达到九五爻之位,并没有“以下为基” “以贱为本” **
甚至对于其它知识点你都持“下贱之态”只想与天齐名,从不脚踏实地从坤做起。
先给总结图 你再看下面的内容
下面就是要告诉你所谓的牛逼技术到底是什么回事!!!
我们测试一下数据库,java,python,go,c/c++,php,redis,docker进行测试【测完你会发现点东西】
然后你再看图比较好
好启动了,没有什么可说的,ELF文件启动。
.ibd是创建数据表时生成的文件,没啥可说的,DBA专业都知道
我画线的地方调用了ACCEPT SOCKET API函数
调用了SENDTO,RECVFROM SOCKET API 函数
mysql怎么实现我们管不着,但是数据来回的传输依赖于LINUX SOCKET API,这些都是网络接口API
调用了系统其它API函数库,我们看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相关函数
启动redis
测试
**epoll_wait 得到就绪的文件描述符读事件返回,然后调用read,其实跟RECVFROM功能一样
它的数据是:3rn$3rnsetrn4rnbfzsrn5rn10000rn
这一堆数据被各种大佬称为 redis的二进制通信请求协议!!!返回是+OKrn**
它们的数据来回传输大部分用read,write函数来实现
dockerd服务ELF文件调用的linux api相关函数库
启动docker服务,跟mysql一样默认启动一堆进程和线程
相关命令运行【对不起,我不喜欢背东西,你要是面试我时,问我docker有哪些命令选项,对不起我回家种地放牛了】
来用下测试
运行过程
都在调用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函数
docker调用的LINUX API 函数库
我直接复制粘粘给你运行对不起我背不了函数,要用就直接复制粘粘就好了
go ELF 文件
来运行那个大家认为的源码文件
先运行哪个函数,你自己看着办哦
重点
熟悉的一批,socket 创建socket文件描述符,然后命名【把ip,端口绑定到此文件上】,然后监听,并阻塞在accept函数上
好了,go就这样子,它封装的比较骚,go elf编译器封装的牛逼,语法换了一套就称为编译型语言了。
py的语法就是好,随便一撸就可以了,简直是粗暴又骚,语法嘛就这样,长得跟少妇一样
来先认识一下python elf文件 毕竟好多爬虫大佬可能没有见过
.php .py .go .java里的东西只是个文本内容,你们嘛叫源码,我没有文化,只能叫ascii text ^_^
启动测试
有没有发现,熟悉的一批
好了,到这里够意思了。
这么简单的语言,你去学语法就行了,简单又粗暴谁不喜欢呢。我都喜欢。 ^_^
测试源码
cat GreetingServer.java
import java.net.*;
import java.io.*;
public class GreetingServer extends Thread
{
private ServerSocket serverSocket;
public GreetingServer(int port) throws IOException
{
serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout(100000000);
}
public void run()
{
while(true)
{
try
{
System.out.println("等待远程连接,端口号为:" + serverSocket.getLocalPort() + "...");
Socket server = serverSocket.accept();
System.out.println("远程主机地址:" + server.getRemoteSocketAddress());
DataInputStream in = new DataInputStream(server.getInputStream());
System.out.println(in.readUTF());
DataOutputStream out = new DataOutputStream(server.getOutputStream());
out.writeUTF("谢谢连接我:" + server.getLocalSocketAddress() + "\nGoodbye!");
server.close();
}catch(SocketTimeoutException s)
{
System.out.println("Socket timed out!");
break;
}catch(IOException e)
{
e.printStackTrace();
break;
}
}
}
public static void main(String [] args)
{
int port = Integer.parseInt(args[0]);
try
{
Thread t = new GreetingServer(port);
t.run();
}catch(IOException e)
{
e.printStackTrace();
}
}
}
看一下java elf文件,我相信java大佬肯定知道我就不费话了
编译一下
我没有学过java,但是看一下报错就知道了,对不对,这么明显的提示,我phper都晓得 ^_^
编译ok
编译好是啥文件
启动java程序开始测试
有没有发现,熟悉的一批
好了,就这么多就行了,没有必要再截图了。
看接下,我们撸c[c++一样]
你们应该看出点熟悉的地方了
int main(int argc,char *argv[])
{
if(argc<=2){
printf("useage:%s ip_address port_number\n",basename(argv[0]));
return 1;
}
const char *ip = argv[1];
int port = atoi(argv[2]);
int ret = 0;
struct sockaddr_in address;
bzero(&address,sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port = htons(port);
int listenfd = socket(PF_INET,SOCK_STREAM,0);
assert(listenfd>=0);
ret = bind(listenfd,(struct sockaddr*)&address,sizeof(address));
assert(ret!=-1);
ret = listen(listenfd,5);
assert(ret!=-1);
bzero(&address,sizeof(address));
address.sin_family = AF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port = htons(port);
int udpfd = socket(PF_INET,SOCK_DGRAM,0);
assert(udpfd>=0);
ret = bind(udpfd,(struct sockaddr*)&address,sizeof(address));
assert(ret!=-1);
struct epoll_event events[MAX_EVENT_NUMBER];
int epollfd = epoll_create(5);
assert(epollfd!=-1);
addfd(epollfd,listenfd);
addfd(epollfd,udpfd);
while(1){
int number = epoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1);
if(number<0){
printf("epoll failre\n");
break;
}
for(int i=0;i<number;i++){
int sockfd = events[i].data.fd;
if(sockfd ==listenfd){
struct sockaddr_in client_address;
socklen_t client_addrlength = sizeof(client_address);
int connfd = accept(listenfd,(struct sockaddr*)&client_address,&client_addrlength);
addfd(epollfd,connfd);
}
else if(sockfd == udpfd){
char buf[UDP_BUFFER_SIZE];
memset(buf,0,UDP_BUFFER_SIZE);
struct sockaddr_in client_address;
socklen_t client_addrlength = sizeof(client_address);
ret = recvfrom(udpfd,buf,UDP_BUFFER_SIZE-1,0,(struct sockaddr*)&client_address,&client_addrlength);
if(ret>0){
sendto(udpfd,buf,UDP_BUFFER_SIZE-1,0,(struct sockaddr*)&client_address,client_addrlength);
}
}
else if(events[i].events & EPOLLIN){
char buf[TCP_BUFFER_SIZE];
while(1){
memset(buf,0,TCP_BUFFER_SIZE);
ret = recv(sockfd,buf,TCP_BUFFER_SIZE-1,0);
if(ret<0){
if((errno==EAGAIN)||(errno=EWOULDBLOCK)){
break;
}
close(sockfd);
break;
}
else if(ret==0){
close(sockfd);
}
else{
send(sockfd,buf,ret,0);
}
}
}else{
printf("something else happened\n");
}
}
}
close(listenfd);
return 0;
}
然后编译,编译好就这样
测试
好了,都不用我废话了,接下来还是测试下php吧,我觉得,虽然有的朋友觉得php咋样咋样,拍黄片嘛,在打黄打非的压力之下当然没啥好名声了。
看下php elf文件
启动并测试跟踪
好了,不用我废话,大家也知道是怎么回事了。
这些api函数怎么用呢?
man socket
linux socket api 是所有语言,数据库等应用的核心低层技术知识,你框架掌握的再6,没有多少意义,语言掌握得再6也只是工具
分布式,集群,高大上的技术都要TCP/IP支持,而它的实现就是网络编程,各语言写法不同,但是核心基础知识没有变化,正所谓天下大事必作于细天下难事必作于易,一上来撸c/c++,java如果不合适你,那么上来就撸PHP掌握了共通的知识再换语言又何妨呢?
**高以下为基,贵以贱为本 互联网技术的核心根基就是TCP/IP,TCP/IP的实现依赖于Linux socket API【我们的项目大部分运行在上面】没有它们各种高大上牛逼的技术就无从建立起来。而这根基对大家所用的java,go,py,php,c,c++,nodejs...都是一样的,只不过是基于Linux api...
赞 17 收藏 12 评论 2
呀呀呀 关注了标签 · 3月13日
an open source project to pack, ship and run any application as a lightweight container ! By Lock !
an open source project to pack, ship and run any application as a lightweight container ! By Lock !
关注 44408
呀呀呀 关注了标签 · 3月13日
一种近几十年来出现的新物种,是工业革命的产物。英文(Programmer Monkey)是一种非常特殊的、可以从事程序开发、维护的动物。一般分为程序设计猿和程序编码猿,但两者的界限并不非常清楚,都可以进行开发、维护工作,特别是在中国,而且最重要的一点,二者都是一种非常悲剧的存在。
国外的程序员节,(英语:Programmer Day,俄语:День программи́ста)是一个俄罗斯官方节日,日期是每年的第 256(0x100) 天,也就是平年的 9 月 13 日和闰年的 9 月 12 日,选择 256 是因为它是 2 的 8 次方,比 365 少的 2 的最大幂。
1024是2的十次方,二进制计数的基本计量单位之一。程序员(英文Programmer)是从事程序开发、维护的专业人员。程序员就像是一个个1024,以最低调、踏实、核心的功能模块搭建起这个科技世界。1GB=1024M,而1GB与1级谐音,也有一级棒的意思。
从2012年,SegmentFault 创办开始我们就从网络上引导社区的开发者,发展成中国程序员的节日 :) 计划以后每年10月24日定义为程序员节。以一个节日的形式,向通过Coding 改变世界,也以实际行动在浮躁的世界里,固执地坚持自己对于知识、技术和创新追求的程序员们表示致敬。并于之后的最为临近的周末为程序员们举行了一个盛大的狂欢派对。
2015的10月24日,我们SegmentFault 也在5个城市同时举办黑客马拉松这个特殊的形式,聚集开发者开一个编程大爬梯。
【SF 黑客马拉松】:http://segmentfault.com/hacka...
【1024程序员闯关秀】小游戏,欢迎来挑战 http://segmentfault.com/game/
欢迎开发者加入~
一种近几十年来出现的新物种,是工业革命的产物。英文(Programmer Monkey)是一种非常特殊的、可以从事程序开发、维护的动物。一般分为程序设计猿和程序编码猿,但两者的界限并不非常清楚,都可以进行开发、维护工作,特别是在中国,而且最重要的一点,二者都是一种非...
关注 155341
呀呀呀 关注了标签 · 3月13日
React (sometimes styled React.js or ReactJS) is an open-source JavaScript library for creating user interfaces that aims to address challenges encountered in developing single-page applications. It is maintained by Facebook, Instagram and a community of individual developers and corporations.
React (sometimes styled React.js or ReactJS) is an open-source JavaScript library for creating user interfaces that aims to address challenges encountered in developing single-page applications. It is maintained by Facebook, Instagram and a commun...
关注 69849
呀呀呀 关注了标签 · 3月13日
层叠样式表(英语:Cascading Style Sheets,简写CSS),又称串样式列表,由W3C定义和维护的标准,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言。
层叠样式表(英语:Cascading Style Sheets,简写CSS),又称串样式列表,由W3C定义和维护的标准,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言。
关注 97482
查看全部 个人动态 →
(゚∀゚ )
暂时没有
(゚∀゚ )
暂时没有
注册于 2020-09-25
个人主页被 278 人浏览
推荐关注