置顶 讨论
为了便于用户理解,推出部分教程支持视频 选择有视频的课程,即可在教程文章中看到视频 登录后才可以观看哦
1年前 喜欢(5) 浏览(3134) 评论(0)
讨论
在提问的时候,适当使用一些小技巧,会让老师快速get到你的问题在哪里,这样会使问题更快被解答喔~ 提问技巧 标题:简洁、易懂,完整表达主题;避免无意义、模糊、口语化标题。 提问内容: 客观描述问题:中性客观描述问题,保证问题的可读性,避免过于简单或模糊; 提供编程环境:问题描述注明编程环境信息,包括操作系统、语言、使用的软件版本等; 输出报错信息:过程中出现异常的话,需提供重现异常的步骤; 输出错误信息:编码过程中的技术问题出现错误应该输出日志或控制台的全部信息,以便更好排查错误; 注明课程时间:针对课程的问题,请在问题描述中注明出现时间,便于及时解答; 排版规范合理:注意文本,代码,标点、语法使用规范,排版合理。 提倡有偿问答:对于有能力的学者,可以提供有偿提问,勾引大神们快速响应(提问者自愿为主,答题者不可强求) 注意: 不要在提问内容框里长篇粘入代码,只需粘出关键代码并加以描述即可 标题不等于提问内容,标题应简明扼要,提问内容应详细描述,二者尽量不要重复。 提问尽量以 PHP/Yii2.0 的内容为主。 千万不要贴一段业务报错代码,问为什么这里报错了,代码调试可以帮您解决大部分的问题。 学员和老师要互相尊重,尊重是有效解决问题的前提,对于人身攻击的问题管理员是有权隐藏的哦~ 说完了如何提问,那么大!神!般!的你在问答区看到了其他小伙伴提出的问题,想要回答时需要注意些什么呢?^_^ 回答建议: 回答保证内容的准确性,不模糊,能实际解决提问者疑问; 回答保证内容通俗易懂,语句通顺、有条理,排版利于阅读; 回答保证内容全面,避免过于简单,可对回答做详细阐释、扩展和引导; 回答保证内容与问题相关,避免所问非所答和过多的重复内容; 添加图片或代码应附上说明,代码用对应代码块包裹并合理排版; 核心思想:要持着“授人以鱼不如授人以渔”的心来回答提问者的问题~
1年前 喜欢(3) 浏览(3176) 评论(4)
讨论
更新 2018年6月10日发布了Yii框架3.0.0 更新的第一个alfa版本 Yii 3.0中的新功能 包 “ezyang/htmlpurifier” 已经成为可选项,默认情况下不会安装 移除 Yii 自动加载器以支持 Composer 的 PSR-4 实现 删除了特定于 HHVM 的代码 在 ApcCache 中删除了 APC 支持, APCu 像以前一样工作 当覆盖默认值时,会更改yii\grid\DataColumn :: $filterInputOptions的行为 将屏蔽的输入字段小部件移动到单独的扩展https://github.com/yiisoft/yii2-maskedinput 邮件消息组成提取到单独的类,yii\mail\Composer,可以通过yii\mail\BaseMailer :: $composer获得设置 将yii\base\InvalidParamException重命名为yii\base\InvalidArgumentException 更新了未安装 intl 扩展时使用的后备日期格式,以匹配最新 ICU 版本的默认值 删除了 XCache 和 Zend 数据缓存支持作为缓存后端 更新了yii\widgets\ActiveField :: hint()方法签名以匹配label() 删除了yii\base\Object :: className(),支持本机PHP语法:: class,它不会触发自动加载 PHP的最低要求版本现在为7.1 所有框架小部件中run()方法的一致行为。现在返回结果以获得更好的可扩展性 yii\web\RequestParserInterface :: parse()的签名已更改为接受yii\web\Requestinstance作为唯一参数 删除了 CUBRID 数据库支持 删除了 PJAX 支持 包 'captcha','jquery','rest','mssql' 和 'oracle' 已被提取到扩展中 删除了在 2.0.x 中标记为已弃用的方法 Yii 3.0中的增强功能 使用random_int()而不是mt_rand()来生成加密安全的伪随机整数 对象yii\helpers\ReplaceArrayValue,yii\helpers\UnsetArrayValue现在支持在使用var_export()函数导出后恢复 添加了yii\web\AssetConverter::$isOutdatedCallback,允许自定义检查过时的资产转换结果 在yii\serialize\* 命名空间下添加了序列化抽象层 增加了对 PSR-3 'Logger' 支持 优化了yii\filters\AccessController处理访问规则 将$checkAjax参数添加到方法yii\web\Controller::redirect(),该方法控制 AJAX 和 PJAX 请求中的重定向 邮件视图呈现封装到yii\mail\Template类中,允许隔离呈现并通过视图内的$this-> context->message 访问 yii\mail\MessageInterface 实例 CAPTCHA渲染逻辑被提取到yii\captcha\DriverInterface中,该实例可通过 yii\captcha\CaptchaAction::$driver 字段获得 yii\web\Request :: getBodyParams() 在无效或缺失 'Content-Type' 头时,生成 415 “Unsupported Media Type” 错误 yii\web\Request :: getBodyParams() 的结果现在包括上传的文件 已上载的文件检索方法已从 yii\http\UploadedFile 移至 yii\web\Request 添加了对 PSR-7 HTTP Message 的支持 根据 PSR-16 “Simple Cache” 规范重构的缓存实现 相对与 Yii2 改动 Yii3这个版本改动相对于Yii2是非常的巨大,包括以下特性: Yii3需要PHP的最低版本是 7.1 并且 HHVM 不再被支持. Yii3 将采用新的版本规则,即 semver since 3.0规则. 不再使用Subtree-split 模式. 放弃使用 Yii自己的 autoloader 改为用 Composer 的autoloader. 框架的结构也进行了大量的调整,分出来好几个包,包括下面这些: yiisoft/yii-core - 这个是Yii Framework . Yii 2.0 的开发还是在 yiisoft/yii2 仓库. Yii2 只支持Bug 和安全补丁,新特性和加强的特性不在被接收。 yiisoft/di - PSR-11适应依赖注入的 container. yiisoft/log - PSR-3 适应 Psr-3的 logging library. yiisoft/cache - PSR-16 适应 psr-16的 caching library. yiisoft/db - 数据库的 abstraction and QueryBuilder. yiisoft/db-mysql - MySQL 的db扩展. yiisoft/db-pgsql - PostgreSQL 的db扩展. yiisoft/db-sqlite - SQLite 的db扩展. yiisoft/db-mssql - MSSQL 的db扩展. yiisoft/db-oracle - Oracle 的db扩展. yiisoft/active-record - ActiveRecord 库. yiisoft/rbac - RBAC 库. yiisoft/view - 视图渲染库. yiisoft/yii-web - Web 扩展. yiisoft/yii-rest - REST API 扩展. yiisoft/yii-console - console 扩展. yiisoft/yii-jquery - JQuery 扩展. yiisoft/yii-bootstrap3 - Bootstrap 3 扩展. yiisoft/yii-bootstrap4 - Bootstrap 4 扩展. yiisoft/yii-dataview - data displaying 扩展. yiisoft/yii-masked-input - Masked input field widget. yiisoft/yii-captcha - CAPTCHA 扩展. 更多的 PSR 兼容: PSR-3, PSR-11, PSR-16 框架核心只需要虚拟PSR实现包,您可以自由选择日志记录器和缓存实现。 更多PSR实现的兼容性预计将在稍后实现。 从Application and Module 删除ServiceLocator ,采用 container来替代. 数据库的扩展被分到几个composer包里面. 删除PJAX 的支持. yiisoft/yii2-composer 这个包不再被使用. 不再提供高级的项目模板. 项目模板也有所变化 yiisoft/yii-project-template - 工程模板; yiisoft/yii-base-web - web的基础应用模板. 我们将为您提供Yii框架中所有最新更改的最新信息。
1年前 喜欢(1) 浏览(7260) 评论(2)
讨论
如题,求demo
1年前 喜欢(0) 浏览(2353) 评论(2)
讨论
说明 课程简介 素材及源码 纠错 课程简介 本课程主要内容是如何通过使用 yii2 框架,快速打造个人博客系统。 博客系统主要分两个部分: 后台管理系统(backend) 相关内容:yii2-admin扩展, RBAC基于角色的权限管理,基于Markdown的富文本编辑器,上传图片到七牛,Gii生成代码,自定义Gii模版 前台内容展示(frontend) 相关内容:挂件的应用(widget),博客首页界面排版,文章内容呈现,博客时间史 素材及源码 为了方便大家学习 yii2 相关的知识并应用于实践中,本次教程会提供学习素材。什么是素材呢?就是基于 hyii2 后台管理系统添加了学习教程时所需要的样式文件,js文件,界面排版等。让大家免去在学习后端框架的过程中,去写前端的页面和js。更加精确的掌握 yii2 框架的实战应用。通过教程的学习可以开发出相应的一套完整的博客系统。详情查看 应用搭建 一章 为了保证课程的高品质,我们需要对素材进行收费,购买链接。购买后请联系 391430388 获取素材和源码 前台界面预览:http://hyblog.itdocs.org 管理后台地址:http://hyblog-admin.itdocs.org 账户:test 密码:123456 作者会提供完整的开发素材和成品源码,希望不要借此传播,尊重原创,万分感谢。 纠错 教程中遇到的问题,可以先自己尝试解决,培养自身的问题排查能力是一个程序员基本的要求。 本地环境问题(本站统一环境教程:PHP开发环境部署)。 代码书写错误,引起的报错。 搜索本教程错误集锦(开发中) 若仍不能解决,请联系 QQ:391430388 当然人无完人,也许教程中也存在一些不可避免的疏漏,如果发现可以联系作者,先行致谢!
精华贴
1年前 喜欢(1) 浏览(3367) 评论(2)
讨论
说明 文章起源:蛮多同学在犹豫选择 PHP 进行学习,这里总结了一些数据,可以作为参考。 为什么 PHP 是最好的语言?你也许会说他的语法好学、部署简单、面面俱到的函数、甚至你会以为我在调侃 PHP 而哈哈大笑。 在我看来,PHP 之所以是星球上最好的语言,是因为有大量的人在使用它。 上面这张数据图,是由 W3Techs 网站提供的 服务器端脚本语言市场占有率,请配合以下信息一起理解此图: 样本是 http://www.alexa.com/ 世界排名前一千万的网站; 此数据每日更新。 以上列表信息选自:Technologies Overview。 大部分的商业网站在使用 PHP,会导致 PHP 的人才需求非常大,学习、使用 PHP 的人群也会很庞大。 PHP 的将来 PHP 的将来是由 PHP7 决定的,再来看下 PHP 7 的表现。 发明 PHP 的 Zend 公司发布的 PHP 与其他语言运行效率对比 下面这一个是 C++ vs Python vs PHP vs Java vs NodeJS性能大PK 从运行结果来看,毫无疑问,PHP7 是最快的 脚本语言 (注意是脚本语言哈)。 有同学在困惑 NodeJS 不是脚本语言? JS 也就是这里的 Nodejs 是运行在是 V8 上的,V8 引擎会对 JS 进行预编译,具体见这里 Is Node.js compiled or interpreted language? - Hashnode 看这个表的时候要注意: Total CPU time 越低越快; Slower than 列里,C++ 对比 C++ 要慢多少 CPU time,previous 是在列表里对比上一个排名的语言要慢多少 CPU time。 Java 8 (non-std lib) 与 Python 2.7 + PyPy 因为不支持通用函数库,所以只参考不列入计算。 简要分析结果如下: NodeJS 快 2 倍。 Java 8 接近慢 2 倍。 Python 在性能上没有什么重大变化。 每个新版本都比上个版本稍快一点,但整体 Python 比 C++ 慢 15 倍。 Perl 与 Python 有相同的趋势,并且比 C++ 慢 22 倍。 PHP 5.x 是最慢的,运行时间是 C++ 的 47 ~ 60 倍之间。 PHP 7 的成绩最为惊人。 它比 PHP 5.x 快 10 倍,比紧随其后的脚本语言 Python 快 3 倍。 最后总结下,学习 PHP 的兄弟们,你们走的路没错。在考虑要不要入坑的同学们,也可以做个参考,最好的语言你怎么着也得学一学吧,至少工作机会不会太少。
1年前 喜欢(0) 浏览(1322) 评论(1)
讨论
老板,您这站的皮肤可以分享一下吗
1年前 喜欢(0) 浏览(1270) 评论(1)
讨论
此篇,主要是演示docker-php-source , docker-php-ext-install ,docker-php-enable-docker-configure 这四个命令到底是用来干嘛的,它们在PHP容器中都做了哪些事情。 很多人很不理解在Dockerfile中安装PHP扩展的时候总是出现这几个命令,本篇就就是为你揭开这些命令的神秘面纱而准备的,所有案例都是本人自己运行过的。 Docker 中的PHP容器安装扩展的方式有 通过pecl方式安装 通过php 容器中自带的几个特殊命令来安装,这些特殊命令可以在Dockerfile中的RUN命令中进行使用。 这里,我们主要讨论的是第二种方案,如何通过PHP容器中的几个特殊命令来安装PHP扩展 PHP中安装扩展有几个特殊的命令 docker-php-source docker-php-ext-install docker-php-ext-enable docker-php-ext-configure 演示这三个命令的作用 都是在PHP容器中进行演示的,PHP容器启动太简单,不作过多介绍 https://www.cnblogs.com/yinguohai/p/11329273.html
7月前 喜欢(0) 浏览(261) 评论(0)
讨论
完整迁移,就是指,不仅将所有代码移植到新的仓库,而且要保留所有的commit记录 1.随便找个文件夹,从原地址克隆一份裸版本库 git clone --bare 旧的git地址 会在当前目录下产生一个 xxx.git 的文件夹 这个步骤,就是克隆git每一次的提交信息,和本地的代码没有关系,只要线上的代码是最新的,这个git版本就是完整的 2.推送裸版本库到新的地址 cd xxx.git git push --mirror 新的git地址 3.删掉xxx.git文件夹 删不删无所谓,只是说明它没有用了而已。 4.代码迁移就成功了,接下来就可以使用新的地址了 git clone 新的git地址
7月前 喜欢(0) 浏览(280) 评论(0)
讨论
Jenkins安装 环境要求:>=Linux kernel 3.10 、Docker; 这里主要阐述基于docker的安装,因为Jenkins官方docker镜像中已经集成好了java tomcat等环境,大量减少了我们的工作量。 步骤 准备工作 #安装docker【参考官方】 #创建Jenkins挂载目录,结构如下 > compose > docker-compose.yml > jenkins > jenkins_home > run > .ssh # 生成私钥和公钥 [root@ub-node-data ~] ssh-keygen -t rsa -C "jenkins@trmall" #拷贝到./jenkins/.ssh目录 [root@ub-node-data ~] cp -r ~/.ssh/ .ssh/ 编写docker-compose.yml 如下: jenkins: image: jenkinsci/blueocean:latest hostname: trmall-data-jenkins networks: trnet: aliases: - trmall.manager.jenkins volumes: - ../jenkins/jenkins_home:/var/jenkins_home # Jenkins主目录 - ../jenkins/run/docker.sock:/var/run/docker.sock # docker 守护进程信息 - ../jenkins/.ssh/id_rsa:/var/jenkins_home/.ssh/id_rsa # 私钥 ports: - 8080:8080 - 50000:50000 创建构建容器 docker-compose -p trmall -f /trmall/compose/docker-compose.yml up -d 容器构建成功后,访问http://ip:8080 开始安装 # 查看初始令牌 docker exec -it trmall_jenkins_1 cat /var/jenkins_home/secrets/initialAdminPassword .... 安装完成 Jenkins自动化部署任务 新建任务准备工作 添加gitLab凭据 填写Private Key 新建任务>一个自由风格的软件项目 源码管理>填写Repositories shell参考 #!/bin/bash yes 2>/dev/null|scp -r ${WORKSPACE}/* root@10.200.148.119:/trmall/projects/service-settlement # 拷贝工作空间代码到远程服务器 并输出执行过程的字符串 ssh -tt root@10.200.148.119 "/trmall/bin/update service-settlement" 至此还不可以部署噢,接下来我们还要设置免密登录,才可以实现远程执行shell 设置免密登录部署节点 还记得之前生成的私钥和公钥吗?现在就要出场了 #检查用户组,若无gid 1000的组则创建Jenkins用户组和用户【注意:这里的uid、gid 1000必须和之后容器内的Jenkins这个用户gid一致】 [root@ub-node-data ~] groupadd -g 1000 jenkins && useradd -g jenkins -u 1000 jenkins #然后将宿主机上映射目录的私钥.ssh/id_rsa所属组用户都改为Jenkins [root@ub-node-data ~] chown -R jenkins:jenkins /trmall/jenkins/.ssh/id_rsa #或直接指定组id皆可,因为容器的本地数据卷中文件/目录的权限是和宿主机上一致的,只是uid/gid在Docker容器和宿主机中可能映射为不同的用户/组名称。 [root@ub-node-data ~] chown -R 1000 /trmall/jenkins/.ssh/id_rsa #然后将公钥 id_rsa.pub 拷贝到部署节点root/.ssh下并重命名为 authorized_keys实现远程免密登陆 至此,最简单的部署实践完成;若分布式大型项目还可以应用saltstack辅助我们支持更丰富的部署解决方案。
8月前 喜欢(0) 浏览(345) 评论(0)
讨论
Redis Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。 特点: - Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 - Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。 - Redis 支持数据的备份,即 master-slave 模式的数据备份。 原子 – Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。 多个操作也支持事务,即原子性,通过 MULTI 和 EXEC指令包起来。 Redis乐观锁的实现:通过 WATCH 和 MULTI EXEC指令实现如下 127.0.0.1:6379> watch hello # watch 监控 hello 的值,在exec执行时做对比,如果值发生改变则exec提交失败(实现乐观锁) OK 127.0.0.1:6379> get hello "4" 127.0.0.1:6379> multi OK 127.0.0.1:6379> incr hello QUEUED 127.0.0.1:6379> incr hello #这一步执行完毕后,去另外一个窗口(ssh窗口2),对hello这个key做incr操作,将其值变成5。完成后,继续后面的exec指令 QUEUED 127.0.0.1:6379> exec (nil) #注意,这是exec执行后返回的是nil,表示事务提交执行失败 127.0.0.1:6379> 127.0.0.1:6379> get hello "5" Redis 的数据类型? Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 sort set(有序集合)。 string(字符串):k-v普通存储 hash(哈希):对象存储,场景:购物车 常用命令:hget hdel hlen(计算购物车总数) hincrby(增加商品件数) list(列表):队列 场景:消息队列,秒杀 常用命令 lpush lpop set(集合):求差集,交集 场景:微博粉丝关注 常用命令:sadd sdiff(差集) sinter(交集) sort set(有序集合):有序集合 场景:分数排名 常用命令:zadd zincrby(增加分数) zcard 我们实际项目中比较常用的是 string,hash 如果你是 Redis 中高级用户,还需要加上下面几种数据结构 HyperLogLog、Geo、Pub/Sub。 如果你说还玩过 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。 Redis 相比 Memcached 有哪些优势? Memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类 Redis 的速度比 Memcached 快 Redis 可以持久化其数据 Redis 的持久化机制是什么?各自的优缺点? Redis提供两种持久化机制 RDB(默认) 和 AOF 机制:(配置在redis.conf) 1、RDB(Redis DataBase)持久化方式: 是指用数据集快照的方式半持久化模式)记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。 优点: - 只有一个文件 dump.rdb,方便持久化。 - 容灾性好,一个文件可以保存到安全的磁盘。 - 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis的高性能) - 相对于数据集大时,比 AOF 的启动效率更高。 缺点: 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候 2、AOF(Append-only file)持久化方式: 是指所有的命令行记录以 redis 命令请求协议的格式完全持久化存储)保存为 aof 文件。 优点: - 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。 - 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof工具解决数据一致性问题。 - AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)) 缺点: - AOF 文件比 RDB 文件大,且恢复速度慢。 - 数据集大的时候,比 rdb 启动效率低。 Redis 常见性能问题和解决方案: Master 最好不要写内存快照,如果 Master 写内存快照,save 命令调度 rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次 为了主从复制的速度和连接的稳定性,Master 和 Slave 最好在同一个局域网 尽量避免在压力很大的主库上增加从库 为什么 redis 需要把所有数据放到内存中? 答 :Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天,redis 将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。 简单redis主从配置 1.主服务器(master)redis不做任何操作 2.从服务器(slave)redis加上 slaveof ip 端口号 配置 masterauth Rf9AtkfyQEMXl5g(主服务器redis密码) redis 过期键的删除策略? 定时删除:在设置键的过期时间的同时,创建一个定时器 timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作。 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。 Redis 如何设置密码及验证密码? 设置密码:config set requirepass 123456 授权密码:auth 123456 使用过 Redis 分布式锁么,它是什么回事? 先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放。 这时候对方会告诉你说你回答得不错,然后接着问如果在 setnx 之后执行 expire之前进程意外 crash 或者要重启维护了,那会怎么样?这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得 set 指令有非常复杂的参数,这个应该是可以同时把 setnx 和expire 合成一条指令来用的! Redis连接时的connect与pconnect的区别 connect:脚本结束之后连接就释放了 pconnect:脚本结束之后连接不释放,连接保持在php-fpm进程中。 Redis 有哪些架构模式?讲讲各自的特点 参考下面的文章,作者感觉写的挺细致的 https://www.cnblogs.com/fishlynn/p/9591021.html 什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免? 缓存穿透 一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。 如何避免? 对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。 对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。 缓存雪崩 当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃。 如何避免? 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。 做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期 不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀 CAP理论是什么? CAP理论
9月前 喜欢(0) 浏览(397) 评论(0)
讨论
索引 1.MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE 2.使用原则 a、对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引, b、数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果。 c、在一同值少的列上(字段上)不要建立索引,比如在学生表的"性别"字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可以建立索引。 3.左模糊查询不能使用索引,比如 select * fromdoc where title like '%XX' 右模糊查询可以使用索引 InnoDB和MyISAM的区别 a.InnoDB 支持事务、行级锁, 而MyISAM都不支持 b.大量查询用MyISAM,经常更新用InnoDB c.myisam支持 FULLTEXT类型的全文索引;innodb不支持FULLTEXT类型的全文索引 d.myisam的索引以表名+.MYI文件分别保存;innodb的索引和数据一起保存在表空间里 "死锁"举例: 表Test:(ID,STATE,TIME) 主键索引:ID 非主键索引:STATE 当执行"UPDATE STATE =1011 WHERE STATE=1000" 语句的时候会锁定STATE索引,由于STATE 是非主键索引,所以Mysql还会去请求锁定ID索引 当另一个SQL语句与语句1几乎同时执行时:“UPDATE STATE=1010 WHERE ID=1” 对于语句2 Mysql会先锁定ID索引,由于语句2操作了STATE字段,所以Mysql还会请求锁定STATE索引。这时。彼此锁定着对方需要的索引,又都在等待对方释放锁定。所以出现了"死锁"的情况。 共享锁(S锁):又称为读锁,可以查看但无法修改和删除的一种数据锁。如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁。获准共享锁的事务只能读数据,不能修改数据。 共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享. 排它锁(X锁):又称为写锁、独占锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A 互斥锁:在编程中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为" 互斥锁" 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 乐观锁:顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量. mysql优化 1.读写分离,分库分表 2.合理的建表,业务分割清楚,合理服务边界划分 3.通过mysql慢查询日志,分析优化sql语句,通过explain分析sql语句 4.建立合理有效的索引 数据库事务中的四大特性 ACID A:原子性(Atomicity) C:一致性(Consistency) I:隔离性(Isolation) D:持久性(Durability) 分布式事务实现会影响性能,增加程序复杂度:最好采用保证数据的最终一致性来间接实现分布式事务。 主键索引(聚簇索引)和非主键索引(二级索引)的区别? 1.主键索引叶子结点存储的是整行的数据,非主键索引叶子结点存储的是该条数据的主键的值 例如ID是主键,k是非主键子段: 如果查询语句是 select * from table where ID = 100,即主键查询的方式,则只需要搜索 ID 这棵 B+树。 如果查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,得到ID=100,再到ID索引树搜索一次,这个过程也被称为回表。 在哪些情况会导致索引无效 1.sql语句中字段左边做了运算则索引不会生效:select * from t where c - 1 = 1000; 2.sql语句中对字段使用了函数则索引不会生效:select * from t where pow(c,2) = 1000; 3.sql语句中左模糊查询索引不会生效(... like '%aa');右模糊查询索引生效 1、脏读:一个事务可以读取另一个未提交事务的数据。需要注意的是这里针对的是数据本身,可以理解为针对单笔数据。 个人理解:事务A开启进行了查询数据,同时事务B开启,修改了其中一笔数据,但并未提交,这时事务A又进行了查询,这时就有两笔不一样的数据,然后事务B并没有结束,事务B进行了事务回滚,这样事务A就读取了事务B修改后未提交的数据。因为这里出现这种根本原因是未对数据进行提交,就进行了读取。 需进行读提交(Read Committed)就能解决。 2、不可重复读:一个事务进行读取,分别读取到了不同的数据。需要注意的是这里针对的是数据本身,可以理解为针对单笔数据,重点是对数据的修改和删除,所以对行加锁就可以解决。 个人理解:事务A对数据进行查询,这时事物B开启,对其中一笔数据进行了修改,然后进行了提交(这里进行了提交),然后事务A又对数据进行了查询,发现同一笔不同了,所以事务A读取了两笔不同的数据,两次读取同笔数据有了不同的数据。出现这种根本原因是在事务A进行读操作时,其他事务对数据进行了修改。 读提交(Read Committed)是不足以解决的,需进行可重复读(Repeatable read)就能解决。 3、幻读:一个事务进行读取,分别读取到了不同的数据。需要注意的是这里针对的是数据条数,可以理解为针对多笔数据是个数据集,重点是对数据的新增,所以对表加锁就可以解决。 个人理解:事务A对数据进行查询,这时事物B开启,对其中一笔数据进行了新增,然后进行了提交(这里进行了提交),然后事务A又对数据进行了查询,发现查询所得的结果集是不一样的。幻读针对的是多笔记录。读提交(Read Committed)是不足以解决的,需进行Serializable 序列化就能解决
9月前 喜欢(0) 浏览(369) 评论(0)
讨论
简述php的垃圾收集机制 答案:php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算循环遍历zval,判断其是否为垃圾,并进行释放处理。 PHP的内核组成 php总共包括3个模块:php内核,zend引擎,PHP扩展层 1.1 php内核:用于处理请求,文件流,错误处理等相关处理。 1.2. zend引擎:将源文件转换成机器语言,然后在zend 虚拟机上运行 zend 整体由两个部分组成: 编译器:负责将php代码编译为可执行的opcodes(中间码/字节码) 执行器:负责将执行编译器输出的opcodes,也就是执行php脚本中编写的代码逻辑 1.3.扩展 扩展层是一组函数、类库和流,php使用它们来执行一些特定的操作,比如安装php_openssl扩展来使用 open ssl函数 php性能优化 APC与Opcache都是字节码缓存也就是,PHP在被编译的时候,首先会把php代码转换为字节码,字节码然后被执行。 php文件第二次执行时,同样还是会重新转换为字节码,但是很多时候,文件内容几乎是一样的,比如静态HTML文件,生成后内容许久都不会改变,用户访问请求直接由服务器读取响应给客户端浏览器。都不用经过PHP进行解析构建了。 PHP APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人员将用户数据驻留在内存中,我们称之为apc_user_cache。 内存中的字节码数据,可以直接缓存进行二次编译。这样程序就会快一些,cpu的消耗也少了。 (这里字节码 就是 opcode) cgi、fast-cgi协议 cgi的历史:早期的webserver只处理html等静态文件,但是随着技术的发展,出现了像php等动态语言。 webserver处理不了了,怎么办呢?那就交给php解释器来处理吧! 交给php解释器处理很好,但是,php解释器如何与webserver进行通信呢? 为了解决不同的语言解释器(如php、python解释器)与webserver的通信,于是出现了cgi协议。只要你按照cgi协议去编写程序,就能实现语言解释器与webserver的通信。如php-cgi程序。 fast-cgi的改进 有了cgi协议,解决了php解释器与webserver通信的问题,webserver终于可以处理动态语言了。但是,webserver每收到一个请求,都会去fork一个cgi进程,请求结束再kill掉这个进程。这样有10000个请求,就需要fork、kill php-cgi进程10000次。 有没有发现很浪费资源?于是,出现了cgi的改良版本,fast-cgi。fast-cgi每次处理完请求后,不会kill掉这个进程,而是保留这个进程,使这个进程可以一次处理多个请求。这样每次就不用重新fork一个进程了,大大提高了效率。 PHP-FPM管理的方式是一个master主进程,多个pool进程池,一个pool进程池多个worker子进程。其中每个进程池监听一个socket php-fpm是什么 php-fpm即php-Fastcgi Process Manager. php-fpm是 FastCGI 的实现,并提供了进程管理的功能。 进程包含 master 进程和 worker 进程两种进程。 master 进程只有一个,负责监听端口,接收来自 Web Server 的请求,而 worker 进程则一般有多个(具体数量根据实际需要配置),每个进程内部都嵌入了一个 PHP 解释器,是 PHP 代码真正执行的地方。 php-fpm 与 swoole 之间的区别 PHP-FPM 1.Master 主进程 / Worker 多进程模式。 2.启动 Master,通过 FastCGI 协议监听来自 Nginx 传输的请求。 3.每个 Worker 进程只对应一个连接,用于执行完整的 PHP 代码。 4.PHP 代码执行完毕,占用的内存会全部销毁,下一次请求需要重新再进行初始化等各种繁琐的操作。 5.只用于 HTTP Server。 Swoole 1.Master 主进程(由多个 Reactor 线程组成)/ Worker 多进程(或多线程)模式 2.启动 Master,初始化 PHP 代码,由 Reactor 监听 Socket 句柄的事件变化。 3.Reactor 主线程负责子多线程的均衡问题,Manager 进程管理 Worker 多进程,包括 TaskWorker 的进程。 4.每个 Worker 接受来自 Reactor 的请求,只需要执行回调函数部分的 PHP 代码。 5.只在 Master 启动时执行一遍 PHP 初始化代码,Master 进入监听状态,并不会结束进程。 6.不仅可以用于 HTTP Server,还可以建立 TCP 连接、WebSocket 连接。 PHP7的新特性?重点 性能提升 ---- 1、变量存储字节减小,减少内存占用,提升变量操作速度 2、改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率 3、改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率 对于大流量的网站,采用什么样的方法来解决访问量问题? 1.负载均衡(分流)微服务架构(服务拆分)读写分离(数据库主从) 2.静态页面 缓存 3.图片服务器分离,cdn加速 4.开启opcache,提高代码执行效率 1、HTML静态化 效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。 2、图片服务器分离 把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛 3、数据库集群和库表散列及缓存 数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。 4、cdn加速 CDN加速意思就是在用户和我们的服务器之间加一个缓存机制,通过这个缓存机制动态获取IP地址根据地理位置,让用户到最近的服务器访问静态资源。 5、负载均衡: Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。 PHP限流方案 1.令牌桶限流方案(nginx可以实现,hyperf框架也支持) 算法:以固定的速度生产令牌,设置令牌上限。每个请求获取令牌token即可正常访问,获取不到即为拒绝访问。 比如每秒产生5个,桶令牌上限为20个,每次请求获取并消耗1个令牌,获取不到则拒绝访问。
9月前 喜欢(1) 浏览(371) 评论(0)
讨论
public function caculatecard($card_id, $dispatch_price, $lotterydiscountprice, $taskcut, $goodsarr, $totalprice, $discountprice, $isdiscountprice, $liveid, $isSubmit = 0) { global $_W; $openid = $_W["openid"]; $uniacid = $_W["uniacid"]; if( empty($goodsarr) ) { return false; } if( p("membercard") ) { $data = p("membercard")->getMemberCard($card_id); } if( empty($data) ) { return NULL; } if( is_array($goodsarr) ) { $goods = array( ); $member_discount = intval($data["member_discount"]); $discount_rate = floatval($data["discount_rate"]); if( isset($data["shipping"]) && $data["shipping"] == 1 ) { $dispatch_price = 0; } $gprice = 0; $cardgoodprice = 0; $newtotalprice = 0; $deductprice = 0; $discountprice = 0; $isdiscountprice = 0; foreach( $goodsarr as $k => &$g ) { if( $g["status"] != 2 ) { if( 0 < $liveid ) { $live_product = pdo_fetch("SELECT * FROM " . tablename("ewei_shop_goods") . " WHERE id = '" . $g["goodsid"] . "'"); if( $live_product ) { $g["marketprice"] = $live_product["marketprice"]; } } $gprice = (double) $g["marketprice"] * (double) $g["total"]; $newtotalprice = 0 + $gprice; if( $g["discounttype"] == 2 ) { if( 0 < $data["discount"] ) { $cardgoodprice += $gprice - (double) $g["discountunitprice"] * (double) $g["total"]; $goodprice = $gprice - (double) $g["discountunitprice"] * (double) $g["total"]; if( 0 < $discount_rate ) { $deductprice += $goodprice * (1 - $discount_rate / 10); $discountprice += (double) $g["discountunitprice"] * (double) $g["total"]; } else { $discountprice -= (double) $g["discountunitprice"] * (double) $g["total"]; } } else { $discountprice = 0; if( 0 < $discount_rate ) { $deductprice += $gprice * (1 - $discount_rate / 10); $cardgoodprice += $gprice * (1 - $discount_rate / 10); } } } else { if( $g["discounttype"] == 1 ) { $cardgoodprice += $gprice - (double) $g["isdiscountunitprice"] * (double) $g["total"]; $goodprice = $gprice - (double) $g["isdiscountunitprice"] * (double) $g["total"]; if( 0 < $data["discount"] ) { $deductprice += $goodprice * (1 - $discount_rate / 10); $isdiscountprice += $g["isdiscountunitprice"] * (double) $g["total"]; } else { $isdiscountprice -= (double) $g["isdiscountunitprice"] * (double) $g["total"]; if( 0 < $discount_rate ) { $deductprice += $gprice * (1 - $discount_rate / 10); $cardgoodprice += $gprice * (1 - $discount_rate / 10); } } } else { if( $g["discounttype"] == 0 ) { if( $g["isnodiscount"] == 1 ) { $cardgoodprice += $gprice; if( $data["discount"] ) { if( 0 < $discount_rate ) { $deductprice += $cardgoodprice * (1 - $discount_rate / 10); } } else { if( 0 < $discount_rate ) { $deductprice += $gprice * (1 - $discount_rate / 10); $cardgoodprice += $gprice * (1 - $discount_rate / 10); } } } else { $cardgoodprice += $gprice; if( $data["discount"] ) { if( 0 < $discount_rate ) { $deductprice += $cardgoodprice * (1 - $discount_rate / 10); } } else { if( 0 < $discount_rate ) { $deductprice += $gprice * (1 - $discount_rate / 10); $cardgoodprice += $gprice * (1 - $discount_rate / 10); } } } } } } } } $carddeduct_text = ""; if( $data["discount_rate"] ) { $carddeduct_text = "会员卡优惠"; } } $sale_plugin = com("sale"); $saleset = false; if( $sale_plugin ) { $saleset = $_W["shopset"]["sale"]; $saleset["enoughs"] = $sale_plugin->getEnoughs(); } if( $saleset ) { foreach( $saleset["enoughs"] as $e ) { if( floatval($e["enough"]) <= $totalprice - $discountprice - $isdiscountprice - $deductprice && 0 < floatval($e["money"]) ) { $deductenough_money = floatval($e["money"]); $deductenough_enough = floatval($e["enough"]); break; } } } $taskreward = $_SESSION["taskcut"]; if( $taskreward && p("task") ) { $taskcut = 0; } $totalprice = $totalprice - $deductprice; $return_array = array( ); $return_array["carddeductprice"] = (double) $deductprice; $return_array["cardgoodprice"] = (double) $cardgoodprice; $return_array["carddeduct_text"] = $carddeduct_text; $return_array["totalprice"] = (double) $totalprice; $return_array["dispatch_price"] = (double) $dispatch_price; $return_array["cardname"] = $data["name"]; $return_array["taskcut"] = (double) $taskcut; $return_array["lotterydiscountprice"] = 0; $return_array["discountprice"] = (double) $discountprice; $return_array["isdiscountprice"] = (double) $isdiscountprice; $return_array["live_id"] = $liveid; $return_array["shipping"] = $data["shipping"]; $return_array["cardgoodprice"] = (double) $cardgoodprice; $return_array["goodsprice"] = (double) $newtotalprice; $return_array["deductenough_money"] = (double) $deductenough_money; $return_array["deductenough_enough"] = (double) $deductenough_enough; $return_array["\$goodsarr"] = $goodsarr; return $return_array; }
1年前 喜欢(0) 浏览(883) 评论(0)
讨论
先问是不是,再问为什么。 难道美国的程序员就不加班吗?他们就一天八小时工作,还想来就来,想走就走?非工作时间完全找不到人?还有什么食物饮料都免费提供? 让我来告诉你真实的情况吧,还...真是这样的。 加班文化应该是中美两地最明显的不同了,形成这种差异的原因不是一两句可以讲清楚的。我在两个国家都工作过,也在不同岗位工作过,所以就尽量从不同角度来简要说一下。 国内程序员加班严重,首先问题不在程序员这个群体。 产品层面拍脑袋决策多 产品层面,拍脑袋决策多,美其名曰:互联网思维、小步快跑、试错思维,其实是没想清楚,反正我就需求一提,技术团队来做,上线后成功了我是产品天才,失败了也没啥坏处,找个借口说什么“互联网市场变化太快”也能搪塞过去,或者找个新项目,继续画大饼。 国内的产品经理实在是太多了,很多还是刚毕业的小鲜肉,没有一点经验积累,凭借天马行空的想象力,提一个需求,就能让一帮技术专家为之操劳好几个月去实现,这简直是不可思议的。即使产品经理很厉害,但人数一多,每个人都要业绩,都拼命想点子、提需求,技术团队怎么能招架得住那么多需求呢。于是就会这些现象:     - 节假日来了,我们上一个活动,或者节日小彩蛋功能。     - 竞品上了一个 xx 功能,看起来不错,我们也抓紧上一个。     - 10个产品经理同时跟你说:这个需求我跟老板对过了,xx 之前必须上线。 产品经理没有想清楚某个功能的价值,或者带来的收益不痛不痒,而技术团队则需要为此付出巨大的心血,也就是加班。当然这也不一定是产品经理的错,国内公司,老板的指令太多了,不说了,你懂的。 在美国这边,产品经理大多是行业经验非常丰富的人,要么是从工程师转过来,要么是从多年的商业领域经历然后读个 MBA转过来。上线一个功能,经过严谨的理论推演、多轮前期调研、科学的 AB test,从提出 idea 到最终用户看到更新,经常耗时半年或一年。很多不成功的 idea 还没面市,就因为数据不好而“胎死腹中”。这样一方面提高了产品需求的质量,另一方面也给技术团队足够多的时间来设计和实现一个可持续发展的架构。 技术团队话语权低 管理层在做决策时,往往更重视产品更新迭代,而忽视技术的建设。 比如说技术团队有100个小时,老板可能会把90小时都投入到实现产品功能,给技术优化、修补技术债务。于是就会出现技术实现非常粗糙的情况,举个栗子,给你一周时间,实现一个 IM 功能,你还会考虑什么模块化、可维护性、性能优化之类的吗?当然是怎么快怎么来,百度一下有没有别人实现过的代码,ctrl+v / ctrl+c,一点运行,诶,跑通了,上线。 所以国内很多程序员看别人的代码,感觉都是一团 shit,完全没法维护,干脆自己重写一个。 技术老大能跑到老板面前说“我们先把产品需求停一停,让我们的技术团队好好地优化一下基础设施吧。”吗?只要他不是傻子,都不会这样说。 话语权低还体现在,对产品几乎没有决策权,甚至不能质疑产品决策,提反对意见,总会被产品经理各种理由挡回来,产品经理有一句话终结争论的尚方宝剑:这是老板要做的。 久而久之,技术债务越堆越高,bug 越来越多,程序员不加班,谁加班? 而美国公司的现象是,技术话语权非常高,一个没想清楚的产品需求,能被技术团队直接打回去。同时,技术团队可以自主地花很多时间在技术优化上面。产品不能按时上线?经理说:没关系,延后,按照最优的技术方案来推进。有时候你想赶紧上线,提交一段粗制滥造的代码,会被同事鄙视死,被老板骂死。 每个季度最后一个月,专门抽出精力,来弥补技术债务,产品需求放一边先。 在这样的环境下,短期看起来效率低,但长期是最高效的。国内是“欲速侧不达”,美国是“慢工出细活”。 技术基础设施差 知乎上有一个比较热门的讨论:腾讯的技术建设是否落后? 这不但是腾讯的问题,实际上绝大部分公司的技术基础设施都非常差。 有多少个公司能养一个专门的 Infra 团队?有多少个技术团队能专门成立一个小团队,进行 Infra 优化?即使有,有多少个公司能保证 Infra 团队的成果能在全公司推行? 我相信能做到这样的公司是凤毛麟角的。 中小公司不必说,在这样高度竞争环境下,哪有财力养一个不能直接带来 KPI 提升的团队,即使有钱,也没时间搞优化。 而大公司呢,即使腾讯这样的体量,有一个 TEG 事业群做基础设施建设。但是现实情况是,依然没有全公司通用的内部工具,各个团队依然在重复造轮子。阿里算是做的很好的,前几年开始推行的大中台战略取得了显著的成果,解放了各个产品部门的生产力。 计算机程序这种东西,一个人写和一群人写,几千个用户使用和几千万用户使用,是完全不同的概念。没有强大的基础设施建设,技术团队越壮大,效率越低,用户数越多,bug 越多。出来混总是要还的,今天没有人关注基础设施,未来就会又无数个程序员为此加班。 而说回美国这边,专门的 Infra 团队几乎是每个公司的标配了。这也是工程师文化的结果,创始人、高管团队一定有很强的技术背景,走过了很多弯路,所以非常重视基础设施建设这种“重要而不紧急”的事情。 畸形的职场文化 最后再来说说文化的差异。 美国人非常注重个人和家庭,牺牲自己的时间来给公司加班,这是不可能的。一到下班时间准点走,非上班时间完全不查邮件。很多公司入职培训就专门强调了怎么平衡工作和生活,其实就是说:下班时间就是你的时间,你有权利不处理公司事务。 反观国内,不知道从什么时候起,加班就是约定俗成的。还出现了看似很有道理的人生经验,比如“年轻人就应该多拼一下”,“加班能学到更多东西,对未来也有好处”。 加班,竟然成了光荣的、可以拿来攀比的现象,比如说加班到凌晨一两点,拍个照,发个朋友圈,收到老板的点赞很开心。而管理者呢,还就吃这一套,谁加班多、会来事儿,考核的时候就更有好处。 在这种加班氛围下,甚至还出现了“伪加班”。早上十点到公司,上个厕所、看会儿新闻、刷刷朋友圈,就到十一点半了,什么工作也没做,然后准备吃午饭;饭后逛一逛、睡个觉,又到2点上班时间了,写会儿代码、刷刷知乎,一下午又过去了,很多公司有免费晚餐,吃完饭回来7点左右,再写写代码,磨到10点。哦耶,又是充实的一天呢,发个朋友圈给老板知道。 其实一天有效工作时间还不够8小时,但就是“加班”了。 综上,大概就是国内加班严重的原因。 我觉得这也是某个时代特有的现象,谁都没有错,谁也没有办法改变这种情况。在国内这样一个高度竞争的环境下,公司为了生存必须跑快点,个人为了发展必须多做事,毕竟你不做就会有千千万万的人来抢。等到中国真的发展到美国这样的发达程度,生存的减小了,才有资格谈更好的生活品质。
1年前 喜欢(1) 浏览(1794) 评论(0)
社区公告
[公告] Yii中文网为优化用户体验进行大版本升级,老版网站会维持一段时间,可以点击顶部"旧版"链接访问旧版网站。
沟通交流

:492175201(技术1群)

:183620600(技术2群)

:291010569(技术3群)

订阅号 | 更多精彩内容推送
本周推荐