呀呀呀

呀呀呀 查看完整档案

填写现居城市  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 个人简介什么都没有

个人动态

呀呀呀 提出了问题 · 4月6日

PHP CI 有办法统计每月发奖次数,然后下个月重置吗

用PHP+CI写的后台,现在要加一个需求,
把每个用户当月的发奖次数统计,然后下个月重置再从0开始计算,请问这个的实现逻辑是什么。
或者说PHP 有办法写这种定时重置的方法吗

关注 3 回答 2

呀呀呀 提出了问题 · 3月13日

解决layui 怎么判断元素是否是选中状态,如果不是就display:none把选择框隐藏

image.png
这四个选择框,第一个框分为首页和国家,想法是选择首页就显示3,4两个选择框 第二个就隐藏。
选择国家就只显示第2个选择框,平时默认就是显示1,3,4这三个框。
image.png

下面附上前端代码

<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>

关注 4 回答 3

呀呀呀 收藏了文章 · 3月13日

ELF php 可执行程序运行后加载重型脚本的过程

PS:本文就是用于回答我朋友的问题【本文以渣男角度陈述】
重型:是指php 可执行文件运行后,会调用大量的文件操作函数【如open,read等】读取大量的php文本文件【只不过老实人喜欢叫php源码文件,并且老实人喜欢重型脚本称为框架】
【本文不按套路陈述用法也不讲用法,不适合小白,本文只是传达一个标题的概念】
本文的环境:linux+php+nginx 其它没有了【本人是渣男,不会遵守任何官方相应条款】
【本文需要你看完以自己去架着轰炸机去测试php-fpm】
安装流程
1 去这里下载 【当然你老实本份就composer create-project laravel/laravel,我是渣男不老实,听说人家不喜欢老实人】
图片.png

图片.png
2 安装
图片.png

它安装时会读取composer.json等文件去下载类库文件,所以你如果安装时遇到各种问题,可以修改composer.json决定要装什么东西,人家说php版本必须是高版本才能装laravel8【这一般是老实的人才会遵守的条款,我是渣男,肯定不会遵守老外的条款】

3 然后瞎配置一下nginx[它会把数据发给php]
图片.png

4 启动服务
nginx只是转发请求给php-fpm处理而已,毕竟这是老传统了,当你愿意遵守这个传统条款时。
图片.png

5 然后我先老实的访问一下
图片.png
图片.png
图片.png

6 以上是老实做法,下面我们根据提示调整参数
这些配置参数不用记,记来干什么?用来面试别人?真是老实人。
图片.png

然后重启服务 ,再来老实的访问
图片.png

然后出现这种,一般这种情况老实人就比较紧张了,怕人家强暴一样的紧张。我们现在看一下php-fpm进程执行的情况

图片.png

上面图中我圈出的就是重点,你硬是看不懂,我没有办法了。 要不599找我手把手教你吧。^_^

接下来根据它的提示调整一下
图片.png

我们调整好以后,再访问
图片.png

这个时候你也别紧张兮兮,我们看一下php-fpm运行laravel的情况再说话,不要像怨妇一样上来就是啊,怎么办?

图片.png

我们看到这php-fpm在运行laravel时,打开的脚本文件那是相当多,我这里只是截图部分,为了处理一个小小的访问,它打开一堆脚本文件,后面它直接去访问500这个文件了。很不给面子。

图片.png

图片.png

7 接下来,我们一步步的看一下我运行,php-fpm为了处理这个重型框架到底加载了多少php脚本文件【部分截图】【自己用电脑看,不要用小的可怜兮兮的手机看,渣男就应该用PC看】

图片.png
图片.png
图片.png
图片.png
图片.png
图片.png

路由注册服务
图片.png

Kernel 核心文件
图片.png

好了,我们不是要研究框架的运行机制,我们现在先看一下500报错页面的加载
图片.png
图片.png

大家可以看到,一个小小的业务需求,它就加载一大堆的【open,read,lstat,close文件,这些操作都是要去磁盘里读取,框架越重,php-fpm处理时间越长,当然了php-fpm本身是个守护进程,接收一次tcp连接和数据传输后,它就断开了】在这里大家可以自行的进行测试,从框架的index.php到最后输出,打开了N个文件,都是要操作磁盘,读取的数据当然是要占用内存,c会申请一堆内存再去处理这些脚本的语法,进行解析。

8 下面随便给你们看下问题所在
图片.png

看一下它写的内容就知道问题在哪里了
write(4, "[2021-01-29 10:47:15] production.ERROR: No application encryption key has been specified. {"exception":"[object] (I
这句话看不懂,那就比较老火了。
你们有兴趣就去看一下它的加密注册服务代码
图片.png

解决一下
图片.png

我不老实,不按上面解决,按渣男方式解决
图片.png
再访问时
图片.png
手动写一个
图片.png
图片.png

下面测试一下

图片.png
改成这吊样
图片.png

请求过程
图片.png
图片.png

最后一把
图片.png
图片.png
//请求
图片.png

路由注册
图片.png

控制器调度
图片.png

响应
图片.png
图片.png
图片.png

php-fpm和nginx运行时系统调用情况【响应北风之神内容的分析】
【统计误差很小,大家可以自行统计】
1 系统调用时产生的记录日志大小
图片.png
php-fpm运行时的系统调用产生:1.4M
ngninx:1.5M

图片.png

open 打开php脚本文件次数
图片.png
图片.png

open 打开php脚本后read读取脚本内容次数
图片.png

read php脚本时大概读取多少个字节
图片.png
图片.png

根据公式换算一下:
1M=1024KB
1KB=1024Byte
1M=1024*1024=1000,000
1362477=1330KB=1M

php-fpm响应给nginx字节数
图片.png
图片.png
nginx响应给用户的字节数
图片.png

图片.png

查看原文

呀呀呀 赞了文章 · 3月13日

ELF php 可执行程序运行后加载重型脚本的过程

PS:本文就是用于回答我朋友的问题【本文以渣男角度陈述】
重型:是指php 可执行文件运行后,会调用大量的文件操作函数【如open,read等】读取大量的php文本文件【只不过老实人喜欢叫php源码文件,并且老实人喜欢重型脚本称为框架】
【本文不按套路陈述用法也不讲用法,不适合小白,本文只是传达一个标题的概念】
本文的环境:linux+php+nginx 其它没有了【本人是渣男,不会遵守任何官方相应条款】
【本文需要你看完以自己去架着轰炸机去测试php-fpm】
安装流程
1 去这里下载 【当然你老实本份就composer create-project laravel/laravel,我是渣男不老实,听说人家不喜欢老实人】
图片.png

图片.png
2 安装
图片.png

它安装时会读取composer.json等文件去下载类库文件,所以你如果安装时遇到各种问题,可以修改composer.json决定要装什么东西,人家说php版本必须是高版本才能装laravel8【这一般是老实的人才会遵守的条款,我是渣男,肯定不会遵守老外的条款】

3 然后瞎配置一下nginx[它会把数据发给php]
图片.png

4 启动服务
nginx只是转发请求给php-fpm处理而已,毕竟这是老传统了,当你愿意遵守这个传统条款时。
图片.png

5 然后我先老实的访问一下
图片.png
图片.png
图片.png

6 以上是老实做法,下面我们根据提示调整参数
这些配置参数不用记,记来干什么?用来面试别人?真是老实人。
图片.png

然后重启服务 ,再来老实的访问
图片.png

然后出现这种,一般这种情况老实人就比较紧张了,怕人家强暴一样的紧张。我们现在看一下php-fpm进程执行的情况

图片.png

上面图中我圈出的就是重点,你硬是看不懂,我没有办法了。 要不599找我手把手教你吧。^_^

接下来根据它的提示调整一下
图片.png

我们调整好以后,再访问
图片.png

这个时候你也别紧张兮兮,我们看一下php-fpm运行laravel的情况再说话,不要像怨妇一样上来就是啊,怎么办?

图片.png

我们看到这php-fpm在运行laravel时,打开的脚本文件那是相当多,我这里只是截图部分,为了处理一个小小的访问,它打开一堆脚本文件,后面它直接去访问500这个文件了。很不给面子。

图片.png

图片.png

7 接下来,我们一步步的看一下我运行,php-fpm为了处理这个重型框架到底加载了多少php脚本文件【部分截图】【自己用电脑看,不要用小的可怜兮兮的手机看,渣男就应该用PC看】

图片.png
图片.png
图片.png
图片.png
图片.png
图片.png

路由注册服务
图片.png

Kernel 核心文件
图片.png

好了,我们不是要研究框架的运行机制,我们现在先看一下500报错页面的加载
图片.png
图片.png

大家可以看到,一个小小的业务需求,它就加载一大堆的【open,read,lstat,close文件,这些操作都是要去磁盘里读取,框架越重,php-fpm处理时间越长,当然了php-fpm本身是个守护进程,接收一次tcp连接和数据传输后,它就断开了】在这里大家可以自行的进行测试,从框架的index.php到最后输出,打开了N个文件,都是要操作磁盘,读取的数据当然是要占用内存,c会申请一堆内存再去处理这些脚本的语法,进行解析。

8 下面随便给你们看下问题所在
图片.png

看一下它写的内容就知道问题在哪里了
write(4, "[2021-01-29 10:47:15] production.ERROR: No application encryption key has been specified. {"exception":"[object] (I
这句话看不懂,那就比较老火了。
你们有兴趣就去看一下它的加密注册服务代码
图片.png

解决一下
图片.png

我不老实,不按上面解决,按渣男方式解决
图片.png
再访问时
图片.png
手动写一个
图片.png
图片.png

下面测试一下

图片.png
改成这吊样
图片.png

请求过程
图片.png
图片.png

最后一把
图片.png
图片.png
//请求
图片.png

路由注册
图片.png

控制器调度
图片.png

响应
图片.png
图片.png
图片.png

php-fpm和nginx运行时系统调用情况【响应北风之神内容的分析】
【统计误差很小,大家可以自行统计】
1 系统调用时产生的记录日志大小
图片.png
php-fpm运行时的系统调用产生:1.4M
ngninx:1.5M

图片.png

open 打开php脚本文件次数
图片.png
图片.png

open 打开php脚本后read读取脚本内容次数
图片.png

read php脚本时大概读取多少个字节
图片.png
图片.png

根据公式换算一下:
1M=1024KB
1KB=1024Byte
1M=1024*1024=1000,000
1362477=1330KB=1M

php-fpm响应给nginx字节数
图片.png
图片.png
nginx响应给用户的字节数
图片.png

图片.png

查看原文

赞 1 收藏 1 评论 0

呀呀呀 收藏了文章 · 3月13日

你心中最高大上最牛X的技术到底是什么

图片.png

图片.png

**高以下为基,贵以贱为本
互联网技术的核心根基就是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】!
每天被各种新技术词汇遮蔽双眼,而基础知识你一直的错失和鄙视低估,就想一步飞龙在天,达到九五爻之位,并没有“以下为基” “以贱为本” **
甚至对于其它知识点你都持“下贱之态”只想与天齐名,从不脚踏实地从坤做起。

先给总结图 你再看下面的内容
图片.png

下面就是要告诉你所谓的牛逼技术到底是什么回事!!!
我们测试一下数据库,java,python,go,c/c++,php,redis,docker进行测试【测完你会发现点东西】
然后你再看图比较好

  • 先测试数据库接收数据时是不是用了Linux网络 socket API

图片.png
好启动了,没有什么可说的,ELF文件启动。
图片.png
.ibd是创建数据表时生成的文件,没啥可说的,DBA专业都知道
图片.png

我画线的地方调用了ACCEPT SOCKET API函数
图片.png
调用了SENDTO,RECVFROM SOCKET API 函数

mysql怎么实现我们管不着,但是数据来回的传输依赖于LINUX SOCKET API,这些都是网络接口API
图片.png
图片.png
调用了系统其它API函数库,我们看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相关函数
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png

  • redis 数据库

图片.png

启动redis
图片.png
测试
图片.png
**epoll_wait 得到就绪的文件描述符读事件返回,然后调用read,其实跟RECVFROM功能一样
它的数据是:3rn$3rnsetrn4rnbfzsrn5rn10000rn
这一堆数据被各种大佬称为 redis的二进制通信请求协议!!!返回是+OKrn**
图片.png

它们的数据来回传输大部分用read,write函数来实现
图片.png
图片.png
图片.png
图片.png

  • docker

图片.png

图片.png
dockerd服务ELF文件调用的linux api相关函数库
图片.png
启动docker服务,跟mysql一样默认启动一堆进程和线程
图片.png
相关命令运行【对不起,我不喜欢背东西,你要是面试我时,问我docker有哪些命令选项,对不起我回家种地放牛了】
图片.png
来用下测试
图片.png
运行过程
图片.png
图片.png
都在调用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函数
docker调用的LINUX API 函数库
图片.png
图片.png
图片.png
图片.png
图片.png

  • go语言写个网络程序

我直接复制粘粘给你运行对不起我背不了函数,要用就直接复制粘粘就好了
图片.png
图片.png

go ELF 文件
图片.png

来运行那个大家认为的源码文件
图片.png
先运行哪个函数,你自己看着办哦
图片.png

重点
图片.png
熟悉的一批,socket 创建socket文件描述符,然后命名【把ip,端口绑定到此文件上】,然后监听,并阻塞在accept函数上
图片.png
图片.png
图片.png

好了,go就这样子,它封装的比较骚,go elf编译器封装的牛逼,语法换了一套就称为编译型语言了。

  • python语言也写个网络程序测试下

图片.png
py的语法就是好,随便一撸就可以了,简直是粗暴又骚,语法嘛就这样,长得跟少妇一样
来先认识一下python elf文件 毕竟好多爬虫大佬可能没有见过
图片.png
图片.png
.php .py .go .java里的东西只是个文本内容,你们嘛叫源码,我没有文化,只能叫ascii text ^_^
图片.png

启动测试
图片.png
图片.png
有没有发现,熟悉的一批
图片.png
图片.png
图片.png
好了,到这里够意思了。

这么简单的语言,你去学语法就行了,简单又粗暴谁不喜欢呢。我都喜欢。 ^_^

  • java 语言网络程序测试

测试源码

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大佬肯定知道我就不费话了
图片.png
图片.png
编译一下
图片.png
我没有学过java,但是看一下报错就知道了,对不对,这么明显的提示,我phper都晓得 ^_^
图片.png
编译ok
图片.png
编译好是啥文件
图片.png
启动java程序开始测试
图片.png
图片.png
有没有发现,熟悉的一批
图片.png
图片.png
图片.png
好了,就这么多就行了,没有必要再截图了。

看接下,我们撸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;
}

然后编译,编译好就这样
图片.png
图片.png
测试
图片.png
图片.png

好了,都不用我废话了,接下来还是测试下php吧,我觉得,虽然有的朋友觉得php咋样咋样,拍黄片嘛,在打黄打非的压力之下当然没啥好名声了。

  • php 网络程序测试
  • 图片.png

看下php elf文件
图片.png
启动并测试跟踪
图片.png
好了,不用我废话,大家也知道是怎么回事了。
图片.png

这些api函数怎么用呢?
man socket
图片.png

linux socket api 是所有语言,数据库等应用的核心低层技术知识,你框架掌握的再6,没有多少意义,语言掌握得再6也只是工具
分布式,集群,高大上的技术都要TCP/IP支持,而它的实现就是网络编程,各语言写法不同,但是核心基础知识没有变化,正所谓天下大事必作于细天下难事必作于易,一上来撸c/c++,java如果不合适你,那么上来就撸PHP掌握了共通的知识再换语言又何妨呢?

查看原文

呀呀呀 赞了文章 · 3月13日

你心中最高大上最牛X的技术到底是什么

图片.png

图片.png

**高以下为基,贵以贱为本
互联网技术的核心根基就是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】!
每天被各种新技术词汇遮蔽双眼,而基础知识你一直的错失和鄙视低估,就想一步飞龙在天,达到九五爻之位,并没有“以下为基” “以贱为本” **
甚至对于其它知识点你都持“下贱之态”只想与天齐名,从不脚踏实地从坤做起。

先给总结图 你再看下面的内容
图片.png

下面就是要告诉你所谓的牛逼技术到底是什么回事!!!
我们测试一下数据库,java,python,go,c/c++,php,redis,docker进行测试【测完你会发现点东西】
然后你再看图比较好

  • 先测试数据库接收数据时是不是用了Linux网络 socket API

图片.png
好启动了,没有什么可说的,ELF文件启动。
图片.png
.ibd是创建数据表时生成的文件,没啥可说的,DBA专业都知道
图片.png

我画线的地方调用了ACCEPT SOCKET API函数
图片.png
调用了SENDTO,RECVFROM SOCKET API 函数

mysql怎么实现我们管不着,但是数据来回的传输依赖于LINUX SOCKET API,这些都是网络接口API
图片.png
图片.png
调用了系统其它API函数库,我们看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相关函数
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png
图片.png

  • redis 数据库

图片.png

启动redis
图片.png
测试
图片.png
**epoll_wait 得到就绪的文件描述符读事件返回,然后调用read,其实跟RECVFROM功能一样
它的数据是:3rn$3rnsetrn4rnbfzsrn5rn10000rn
这一堆数据被各种大佬称为 redis的二进制通信请求协议!!!返回是+OKrn**
图片.png

它们的数据来回传输大部分用read,write函数来实现
图片.png
图片.png
图片.png
图片.png

  • docker

图片.png

图片.png
dockerd服务ELF文件调用的linux api相关函数库
图片.png
启动docker服务,跟mysql一样默认启动一堆进程和线程
图片.png
相关命令运行【对不起,我不喜欢背东西,你要是面试我时,问我docker有哪些命令选项,对不起我回家种地放牛了】
图片.png
来用下测试
图片.png
运行过程
图片.png
图片.png
都在调用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函数
docker调用的LINUX API 函数库
图片.png
图片.png
图片.png
图片.png
图片.png

  • go语言写个网络程序

我直接复制粘粘给你运行对不起我背不了函数,要用就直接复制粘粘就好了
图片.png
图片.png

go ELF 文件
图片.png

来运行那个大家认为的源码文件
图片.png
先运行哪个函数,你自己看着办哦
图片.png

重点
图片.png
熟悉的一批,socket 创建socket文件描述符,然后命名【把ip,端口绑定到此文件上】,然后监听,并阻塞在accept函数上
图片.png
图片.png
图片.png

好了,go就这样子,它封装的比较骚,go elf编译器封装的牛逼,语法换了一套就称为编译型语言了。

  • python语言也写个网络程序测试下

图片.png
py的语法就是好,随便一撸就可以了,简直是粗暴又骚,语法嘛就这样,长得跟少妇一样
来先认识一下python elf文件 毕竟好多爬虫大佬可能没有见过
图片.png
图片.png
.php .py .go .java里的东西只是个文本内容,你们嘛叫源码,我没有文化,只能叫ascii text ^_^
图片.png

启动测试
图片.png
图片.png
有没有发现,熟悉的一批
图片.png
图片.png
图片.png
好了,到这里够意思了。

这么简单的语言,你去学语法就行了,简单又粗暴谁不喜欢呢。我都喜欢。 ^_^

  • java 语言网络程序测试

测试源码

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大佬肯定知道我就不费话了
图片.png
图片.png
编译一下
图片.png
我没有学过java,但是看一下报错就知道了,对不对,这么明显的提示,我phper都晓得 ^_^
图片.png
编译ok
图片.png
编译好是啥文件
图片.png
启动java程序开始测试
图片.png
图片.png
有没有发现,熟悉的一批
图片.png
图片.png
图片.png
好了,就这么多就行了,没有必要再截图了。

看接下,我们撸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;
}

然后编译,编译好就这样
图片.png
图片.png
测试
图片.png
图片.png

好了,都不用我废话了,接下来还是测试下php吧,我觉得,虽然有的朋友觉得php咋样咋样,拍黄片嘛,在打黄打非的压力之下当然没啥好名声了。

  • php 网络程序测试
  • 图片.png

看下php elf文件
图片.png
启动并测试跟踪
图片.png
好了,不用我废话,大家也知道是怎么回事了。
图片.png

这些api函数怎么用呢?
man socket
图片.png

linux socket api 是所有语言,数据库等应用的核心低层技术知识,你框架掌握的再6,没有多少意义,语言掌握得再6也只是工具
分布式,集群,高大上的技术都要TCP/IP支持,而它的实现就是网络编程,各语言写法不同,但是核心基础知识没有变化,正所谓天下大事必作于细天下难事必作于易,一上来撸c/c++,java如果不合适你,那么上来就撸PHP掌握了共通的知识再换语言又何妨呢?

查看原文

赞 17 收藏 12 评论 2

呀呀呀 关注了标签 · 3月13日

docker

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程序员节,中国程序员节

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/

  • SF 开发者交流群:206236214
  • 黑客马拉松交流群:280915731
  • 开源硬件交流群:372308136
  • Android 开发者交流群:207895295
  • iOS 开发者交流群:372279630
  • 前端开发者群:174851511

欢迎开发者加入~

交流群信息


程序员相关问题集锦:

  1. 《程序员如何选择自己的第二语言》
  2. 《如何成为一名专业的程序员?》
  3. 《如何用各种编程语言书写hello world》
  4. 《程序员们最常说的谎话是什么?》
  5. 《怎么加入一个开源项目?》
  6. 《是要精于单挑,还是要善于合作?》
  7. 《来秀一下你屎一般的代码...》
  8. 《如何区分 IT 青年的“普通/文艺/二逼”属性?》
  9. 程序员必读书籍有哪些?
  10. 你经常访问的技术社区或者技术博客(IT类)有哪些?
  11. 如何一行代码弄崩你的程序?我先来一发
  12. 编程基础指的是什么?
  13. 后端零起步:学哪一种比较好?
  14. 大家都用什么键盘写代码的?

爱因斯坦

程序猿崛起

关注 155341

呀呀呀 关注了标签 · 3月13日

react.js

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.

关注 69849

呀呀呀 关注了标签 · 3月13日

css

层叠样式表(英语:Cascading Style Sheets,简写CSS),又称串样式列表,由W3C定义和维护的标准,一种用来为结构化文档(如HTML文档或XML应用)添加样式(字体、间距和颜色等)的计算机语言。

关注 97482

认证与成就

  • 获得 0 次点赞
  • 获得 4 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 4 枚铜徽章

擅长技能
编辑

(゚∀゚ )
暂时没有

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2020-09-25
个人主页被 278 人浏览