PHP100中文网 – 中国第一档PHP资源分享门户 http://www.php100.com PHP100中文网是国内第一家以PHP资源分享为主的专业网站,也提供了PHP中文交流社区。面向PHP学习研究者提供:最新PHP资讯、原创内容、开源代码和PHP视频教程等相关内容 Mon, 02 Sep 2019 03:27:43 +0000 zh-CN hourly 1 https://wordpress.org/?v=5.2.2 除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性? http://www.php100.com/9/20/27557.html http://www.php100.com/9/20/27557.html#respond Mon, 02 Sep 2019 02:54:48 +0000 http://www.php100.com/9/20/27557.html

前言

在前几天(美国时间8月20日)的早些时候,Android Studio(以下简称为AS) 3.5正式版终于发布了,从第一个bate版本发布到正式版本,历时三个半月。AS一直以来被开发者吐槽,因此谷歌也放慢了版本的变化,对测试版本进行大力度的优化,提高了稳定性。从3.3版本开始,谷歌启动了名为Project Marble的计划,意为谷歌团队致力于使集成开发环境(IDE)的基本功能和流程变得坚如磐石,同时精炼和完善面向用户的功能。而AS 3.5则是Project Marble主要成果的版本,下面来介绍主要成果。

Project Marble:系统健康

推荐的内存设置

如果AS检测到可以增加操作系统为AS进程分配的最大RAM(例如IDE,Gradle守护程序和Kotlin守护程序)来提高性能,那么AS将会弹窗提示,如下图(图片来自官方文档)

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

当然你也可以通过菜单打开配置,路径File > Settings(mac: Android Studio > Preferences),可以在Appearance & Behavior > System Settings中找到Memory Settings的配置选项。

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

内存使用报告

AS的内存问题有时难以重现和报告,为帮助解决此问题,在AS 3.5中可以通过菜单栏中的Help > Analyze Memory Usage来生成内存使用情况报告,点击之后会自动生成报告,提示重启AS。重启完毕后,会显示内存使用报告,你可以发送报告给AS团队,以分析使用问题。内存报告如下图

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

Windows:杀毒软件导致的IO问题

大部分开发者用的是Windows系统,而杀毒软件的文件扫描系统会实时扫描新文件。在AS构建项目时,Gradle会编译程序的资源和源代码,然后将编译后的资源打包在一起,在此过程中,会生成大量的文件,如果杀毒软件进行扫描会严重降低构建速度。所以可以关闭杀毒软件提升速度(不建议),或者把AS的一些目录添加到杀毒软件实时扫描的忽略目录。有这些目录Gradle缓存目录:%USERPROFILE%(用户目录).gradleAndroid SDK目录
Android项目目录
Android Studio目录

Project Marble:特色功能改进

Apply Changes为了能不重启应用就使修改的代码和资源生效,以前推出了Instant Run,但是效果并不好,AS 3.5则推出了Apply Changes,与Instant Run重新编写APK的字节码技术不同,Apply Changes是通过利用Android 8.0(API级别26)或更高版本中支持的 Android JVMTI(https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#bci)技术。所以如果想使用Apply Changes有两个条件:

  • Apk必须是debug包
  • 必须在Android 8.0以上的手机上运行

Apply Changes按钮在菜单栏上,在运行的右侧新增两个按钮,如下图(图片来自官方文档)

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

Apply Changes and Restart Activity:尝试通过重新启动活动但不重新启动应用程序来应用资源和代码更改。如果有代码和资源的修改可以使用这个来使代码和资源即时生效。Apply Code Changes:尝试仅应用代码更改而不重新启动任何内容。如果只有代码修改,可以使用这个来使代码生效。如果修改了代码和资源,请使用“Apply Changes and Restart Activity ”。当使用Apply Changes失败时,AS会提醒是否重新运行应用,如果不想AS进行提醒而在失败时直接重新运行应用,可以打开File > Settings(mac: Android Studio > Preferences),在Build, Execution, Deployment > Deployment中选择两个复选框即可。需要注意的是如果是修改了onCreate中的代码则必须重启应用修改才可生效。

应用部署流程

AS 3.5新增了一个下拉菜单,可以直接选择需要部署的机器。而且菜单中还包含一个选项,可以同时部署到多台设备。下拉菜单如下图

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

部署到多设备如下图

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

改进了Gradle同步和缓存检测在以前的版本中,AS会定期清理下载的依赖项,可能会导致Sync失败,而AS 3.5版本改进了这个策略,更好地确定Gradle清理缓存的实际,减少同步失败的情况发生。改进了构建错误输出日志在新版本中,在build时为以下的构建过程提供了更好的错误报告,例如指向文件的链接和报告错误的行:

  • AAPT编译和链接
  • R8和ProGuard
  • Dexing
  • 资源合并
  • XML文件解析
  • Javac,Kotlinc和CMake编译
  • 项目升级

改进了更新体验,提供了更多信息和操作,可以更好的更新IDE和Android Gradle插件。例如,如果出现错误,现在会有更详细的同步和构建错误日志。现在可以独立的更新IDE而不影响其他的功能,例如Android Gradle插件可以在以后进行更新。

  • 布局编辑器-

AS 3.5对布局的可视化,管理和交互做了一些改进。例如在使用ConstraintLayout布局时,属性面板里的约束显示了所有的约束关系,可以直接进行选择 。如下图(图片来自官方文档)

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

同时也可以选择一个约束,然后点击Delete键进行删除约束。也可以按下Ctrl(mac:command)键,然后点击一个约束进行删除。当按下Ctrl(Command)键时,鼠标悬停在约束上时,任何与之关联的约束都会变为红色,表示可以点击该约束进行删除。选择视图后,可以通过单击属性面板的约束小组件部分中的任何+图标来创建约束,如下图(图片来自官方文档)。创建新约束时,布局编辑器现在突出显示约束,提供即时的可视反馈。

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?
image

现在创建约束时,布局编辑器仅显示可以约束的合格锚点。而在以前的版本中,无论是否可以约束它们,布局编辑器会突出显示所有视图上的所有锚点。此外,在约束的目标会突出显示蓝色叠加层。如下图的对比在AS 3.4中的表现

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?
image

在AS 3.5中的表现

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

除上述更新外,AS 3.5还包含以下布局编辑器的改进:该 Constraint Widget和margin下拉选项中会有dimens资源选项。
在布局编辑器的工具栏中,设备列表数据以及更新。此外,调整设备大小时的行为改进,现在调整设备大小的操作手柄始终可见。在调整大小时,会出现显示常见的各种设备的叠加层。
现在布局编辑器有新的配色方案(变浅了),提高了一致性并降低组件,文本和约束之间的对比度。蓝图模式包括了对未显示文本的某些组件的文本支持。

Data Binding

此版本中,除了为数据绑定添加了增量处理支持之外,而且在XML中创建data binding表达式时改进了智能编辑器功能和性能。在3.4版本中的效果

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

在3.5版本中的效果

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

改进了对C / C ++项目的支持AS 3.5包含一些改进,对C / C ++项目更好的支持,对一些大型项目,大大提高了编译的速度。对Build Variants面板改进您现在可以在Build Variants面板中指定Active Build Variant和Active ABI 。这个功能简化了每个模块的构建配置,还提高了Gradle同步的性能。

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

并行的NDK版本现在可以并排使用多个版本的NDK。这个功能在配置项目时提供了更大的灵活性: 例如,如果项目在同一台计算机上需要使用不同版本的NDK就会很方便。如果使用了Android Gradle Plugin3.5.0或更高版本,还可以指定项目中每个模块应使用的NDK版本。可以使用这个功能创建可重现的构建,并减轻NDK版本与Android Gradle插件之间的不兼容性。

Chrome OS支持

AS现在正式支持Chrome OS设备,可以在下载页面下载相应的版本。动态特性支持AS 3.5 增强了对应用程序包特性的支持,为应用程序包添加了动态特性支持。开发者可以根据硬件特性(如OpenGL版本、对AR的支持)设置条件,或者根据API级别和用户国家地区设置条件。新建module时选择Dynamic Feature Module并点击Next就会出现如下图所示的选项,具体的详细配置可以参考https://developer.android.com/studio/projects/dynamic-delivery/conditional-delivery

除了废弃 Instant Run, 稳定版AndroidStudio 3.5还有什么新特性?

IntelliJ IDEA 2019.1

AS 3.5的IDE已经更新了IntelliJ IDEA到2019.1的版本,关于IDEA2019.1版本的详细更新可以参考这个链接

Android Gradle plugin 3.5.0

随着AS 3.5的发布,Android Gradle plugin也更新到了3.5.0,关于plugin的更新内容可以参考这个链接那么,现在升级到3.5.0吧,可以在AS内进行增量更新,也可以下载最新安装包重新安装。下载地址

https://developer.android.com/studio#downloads

]]>
http://www.php100.com/9/20/27557.html/feed 0
关于程序员之间的鄙视链 http://www.php100.com/9/20/27542.html http://www.php100.com/9/20/27542.html#respond Mon, 02 Sep 2019 02:54:44 +0000 http://www.php100.com/9/20/27542.html 相信这么努力的你 已经星标了我 

老九学堂 你身边的IT导师

关于程序员之间的鄙视链

鄙视像条食物链,
是个绕不开的怪圈。
在这个怪圈中,每一个人,
都在链条的最末端。

朋友圈有鄙视链,
相亲有鄙视链,
程序员圈也有鄙视链
看完下面的鄙视链,
你是哪一层?

↓↓↓↓

【1】努力成为全栈,吊打产品经理

关于程序员之间的鄙视链

【2】手感这个东西玄学的很,
像我,就喜欢C++

关于程序员之间的鄙视链

【3】程序员喜欢穿什么衣服上班?

关于程序员之间的鄙视链

【4】汇编:我鄙视所有在座的

关于程序员之间的鄙视链

【5】来自一个后端程序员对前端技术的鄙视

关于程序员之间的鄙视链

【6】PHP是世界上最好的语言!

关于程序员之间的鄙视链

【7】有女朋友的程序员不多,
但有老婆的真的很多

关于程序员之间的鄙视链

【8】汇编语言一出来,
PHP都要靠边站

关于程序员之间的鄙视链
【9】键盘之于程序员,
正如妹子之于汉子

关于程序员之间的鄙视链

【10】Mac OS 还是有必要的

关于程序员之间的鄙视链

【11】语言的鄙视链,
汇编才是在顶端的人。

关于程序员之间的鄙视链

程序语言篇

懂 Functional Programming 的工程师鄙视老是把设计模式挂在嘴边的工程师。
 
老是把设计模式挂在嘴边的工程师,鄙视会说「你这样写就不 OO 了啊」。
把同一段 code 到处复制贴上的工程师鄙视 PM。
 
写静态语言的工程师鄙视写动态语言的工程师。
 
写组合语言的工程师鄙视写 C 语言的工程师。
 
C 语言工程师鄙视 C++ 工程师。
 
C++ 工程师鄙视 Java 和 C# 工程师。
 
Java 工程师和 C# 工程师则互相鄙视。
 
而 C# 工程师又鄙视 Visual Basic 工程师和会把 C# 念成「C 井」的工程师,
会把 C# 念成「C 井」的工程师则鄙视认为 HTML 是一种程序语言的设计师。
 
用 Python 3 的工程师鄙视还在用 Python 2 的工程师。
 
用 Python 2 的工程师鄙视遇到 UnicodeEncodeError 的工程师。
 
写 iOS 的工程师鄙视写 Android 的工程师,写 Android 的工程师鄙视写 Windows Phone 的工程师。
 
有 Swift 一年经验的工程师鄙视有 Objective-C 五年经验的工程师,写 Objective-C 的工程师鄙视用 PhoneGap 包装成 native app 的工程师。
 
用 React.js 的工程师鄙视用 AngularJS 的工程师。
 
用 AngularJS 的工程师鄙视用 jQuery 的工程师。
 
用 jQuery 的工程师鄙视用Vanilla JavaScript的工程师。
 
用 Vanilla JavaScript 的工程师鄙视 IE 的使用者。
 
会用 debugger 的工程师鄙视用 assert 的工程师,
用 assert 的工程师鄙视只会 print () 的工程师。
 
用 console.log () 来 debug 的工程师鄙视用 alert () 来 debug 的工程师。
 
写 Ruby on Rails 的工程师鄙视所有使用其他语言的工程师。
 
什么?你说 Ruby?Ruby 只是 Ruby on Rails 的一套框架,才不是什么程序语言呢!
所有的工程师都鄙视PHP工程师。

工具篇

用 text editor 的工程师鄙视用 IDE 的工程师。
 
用 Vim 的工程师鄙视用 Emacs 的工程师。
 
用 Emacs 的工程师鄙视用 Vim 的工程师。
 
无论是用 Vim 或 Emacs 的工程师都鄙视所有用其他编辑器的工程师。
 
用 Atom、Notepadd++、Sublime Text 的工程师鄙视用 Windows 记事本的工程师。
 
用 Android Studio 或 IntelliJ IDEA 的工程师鄙视用 Eclipse 的工程师。
 
用 Eclipse 的工程师鄙视用 NetBeans 的工程师。
 
用 Git 或 Mercurial 的工程师鄙视用 Subversion 的工程师。
 
用 Subversion 的工程师鄙视用 Dropbox 来做版本控制的工程师。
 
用 Dropbox 来做版本控制的工程师鄙视根本不知道什么叫做版本控制的工程师。
 
用 Zsh 的工程师鄙视用 Bash 的工程师。
用 Bash 的工程师鄙视用 Cygwin 的工程师。
 
用 Cygwin 的工程师鄙视用「命令提示字元」的工程师。
 
用命令提示字元的工程师鄙视用 GUI 介面的工程师。
 
用 IRC 的工程师鄙视用 HipChat 的工程师
用 HipChat 的工程师鄙视用 Slack 的设计师。
 
用 reStructuredText 写文件的工程师鄙视用 Markdown 写文件的工程师,
用 Markdown 写文件的工程师鄙视用 HTML 写文件的工程师,
用 HTML 写文件的工程师鄙视不写文件的工程师,
然后用 LaTeX 写文件的工程师鄙视所有工程师。
 
用 Docker 来部署 server 的工程师鄙视用 Ansible 或 Puppet 来部署 server 的工程师,
用 Ansible 或 Puppet 来部署 server 的工程师鄙视用 Fabric 来部署 server 的工程师,
 
用 Fabric 来部署 server 的工程师鄙视手动 SSH 的工程师。

硬件篇

用 MacBook Pro Retina 的工程师鄙视用 MacBook Air 的工程师。
 
用 MacBook Air 的工程师鄙视用 ThinkPad 的工程师。
 
然后用 Raspberry Pi 的工程师鄙视用 MacBook Pro Retina 的工程师。
 
用 Dvorak 键盘的工程师鄙视用 Mac 键盘的工程师,用 Mac 键盘的工程师鄙视用 QWERTY 键盘的工程师
用 QWERTY 键盘的工程师鄙视用手写板的设计师。
 
坐 Aeron 椅子的工程师鄙视坐普通办公椅的工程师
 
坐普通办公椅的工程师鄙视跟他一样做普通办公椅的 PM
 
然后站着写程序的工程师鄙视坐 Aeron 椅子的工程师。

OS 篇

用 Mac OS X 的工程师鄙视用 Linux 的工程师
 
用 Linux 的工程师鄙视用 Windows 的工程师。
 
用 Debian 的工程师瞧不起用 Ubuntu 的工程师
 
用 Ubuntu 的工程师瞧不起用非 LTS 版本的 Ubuntu 的工程师。

职场篇

搞硬件的工程师鄙视搞软件的工程师。
 
写 OS 的工程师鄙视写 Web 的工程师
 
写 Web 的工程师鄙视写 desktop application 的工程师。
 
后端工程师鄙视前端工程师。
 
工程师跟设计师互相鄙视。
 
信奉 Test-Driven Development 的工程师鄙视先写 code 再补 tests 的工程师,
 
先写 code 再补 tests 的工程师鄙视不写 tests 的工程师,
 
不写 tests 的工程师鄙视又他妈乱改需求的 PM。
 
没有证照的工程师鄙视考了一堆证照的工程师。
 
上班穿休闲服的工程师鄙视上班穿西装的工程师。
 
上班穿西装的工程师鄙视上班穿西服的工程师。

(PS:鄙视链的底层并不代表你选的那门语言就毫无价值。
]]>
http://www.php100.com/9/20/27542.html/feed 0
PHP 穷途末路? http://www.php100.com/9/20/27529.html http://www.php100.com/9/20/27529.html#respond Mon, 02 Sep 2019 02:54:38 +0000 http://www.php100.com/9/20/27529.html
PHP 穷途末路?

脚本之家

你与百万开发者在一起

PHP 穷途末路?

PHP 穷途末路? 

PHP也曾有过辉煌的日子,但如今这门编程语言已经穷途末路了吗?

PHP 穷途末路?

作者 | Daan

译者 | 弯月,责编 | 郭芮

出品 | CSDN(ID:CSDNnews)

以下为译文:
StackOverflow上的很多人都说PHP已经死翘翘了。他们说的对吗?还是因为他们不喜欢PHP?在本文中,就让我们一起来看一看PHP,看看这门编程语言是否还有未来。

1


PHP仍在主导Web

简单地看一看数字统计,就可以确定PHP并没有死。目前PHP仍是最常用的服务器端编程语言,大约75%的网页都是用PHP编写的。根据下面的图表就可以看出PHP在使用频率上遥遥领先。
这个统计数据表明PHP并没有死,因为75%这个数字距离死亡太遥远了!

PHP 穷途末路?

数据来源:w3techs.com
这么多网站使用PHP的原因之一是因为WordPress使用了PHP。在所有网站中, WordPress的市场份额约占34%。也就是说,全世界有7500万个网站都使用了WordPress。
此外,还有一些CMS,比如Drupal(3%)和Joomla(2%),它们也占有很大的市场份额。还有一些流行的店铺管理系统,比如Shopify,大约占总市场份额的1%左右。
许多大型的内容管理系统和店铺管理系统也都在使用PHP,因此PHP依然稳居高位。

2

从头开始构建网站
我看到很多有关从头开始构建网站的争论,因为许多使用WordPress的人都不知道如何写代码。利用WordPress创建网站就不需要知道如何写代码。许多拥有WordPress网站的人可能甚至都不知道背后是PHP提供的支持。那么,从头开始构建网站的人仍然会使用PHP吗?
PHP曾经是,且仍然是一种非常流行的语言。其中一个原因就在于,它是一种非常容易学习的编程语言。如果你想新建网站,那么PHP是一门非常优秀的语言。学习PHP不需要任何预备知识,我敢说大多数已经存在一段时间的网站的开发人员都可能是从PHP入门的,或者至少在某一时期接触过PHP。

3

编程
PHP自1994年诞生以来一直活跃在我们周围,尽管这门语言随着时间的推移变得有点混乱。构建同一个功能的方法有很多种,而且很多方法都非常糟糕,因此很容易在PHP中编写出糟糕的代码。然而,无论用任何语言都有可能编写出糟糕的代码,只不过PHP的发展方向让这种倾向更为明显罢了。
距离PHP的诞生已经过去了很长时间,但它依然保留了很多旧的功能。因此,PHP的入门非常简单,但如果你坚持使用旧的解决方案,那么最终可能无法获得符合最佳实践的代码,而我们应该尽量避免这种情况。如果你缺乏PHP的编程经验,那么就有可能不会遵循最佳实践,因为你不清楚哪种才是最佳解决方案。因为在PHP中解决同一个问题的方法有很多种,这也是有些开发人员讨厌PHP的原因之一。
另一方面,你可能会说大多数Web开发人员都不会编写原始的PHP。大多数时候,你都依赖框架完成大多数工作。Laravel是一个非常流行的PHP框架。使用框架的好处在于很多混乱的工作都是在幕后完成的,这个框架会迫使你编写更清晰的代码。

4

PHP 7
自PHP 7发布以来,已经引入了许多新功能和改进。两个重大的改进是:提升速度和内存的使用。也就是说,使用PHP 7构建的网站的加载速度远远超过了旧版的网站,而且可以同时处理更多用户。
代码方面已经引入了类型声明和新运算符,错误处理也得到了改善。

PHP 穷途末路?

5

工作
由于75%的网站都使用了PHP,因此市场上涉及PHP编程的工作也很多。所有这些网站都需要维护,那么就需要PHP开发人员。PHP巨大的市场份额不会在一夜之间消失,因此PHP方面的工作会在未来持续出现。
点击StackOverflow的这个求职链接(https://stackoverflow.com/jobs/developer-jobs-using-php),你就会发现有关PHP的招聘还是有很多。

6

总结
尽管有关PHP未来走向的争论无休无止,但很明显PHP的未来确实很光明——它是迄今为止使用最广泛的Web编程语言。
PHP诞生已经很长一段时间了,所以代码中也有所体现,包含很多旧功能意味着大家不是很清楚哪种才是最好的解决方案。至于代码方面,你可以利用框架处理大量的底层工作,并强制你编写更清晰的代码。自从PHP 7推出以来,该语言的很多方面都有所改善。
如果你想成为一名PHP开发人员,那么在找工作的时候就不用发愁了。有关PHP编程方面的工作很多,而且这种情况在未来还将持续。
那么,你觉得PHP怎么样呢?你觉得这种编程语言有未来吗?或者你觉得PHP已经死了?请在下方留言。

PHP 穷途末路?

原文:https://medium.com/better-programming/does-php-have-a-future-6756f166ba8
本文为CSDN翻译,转载请注明来源出处。

PHP 穷途末路?


更多精彩


在公众号后台对话框输入以下关键词

查看更多优质内容!


女朋友 | 大数据 | 运维 | 书单 | 算法

大数据 | JavaScript | Python | 黑客

AI | 人工智能 | 5G | 区块链

机器学习 | 数学 | 留言送书

PHP 穷途末路?PHP 穷途末路?

● PHP 穷途末路? 文末送书 | Node.js十年,你大爷还是你大爷PHP 穷途末路?

● PHP 穷途末路? 脚本之家粉丝福利,请查看!

● PHP 穷途末路? 那些裸辞的程序员,都干嘛去了?

● 致敬经典:Linux/UNIX必读书单推荐给你

● 作为程序员,我在电脑上都装过哪些 Chrome 插件?

PHP 穷途末路?

]]>
http://www.php100.com/9/20/27529.html/feed 0
探讨Session机制 | PHP基础笔记 http://www.php100.com/9/20/27511.html http://www.php100.com/9/20/27511.html#respond Mon, 02 Sep 2019 02:54:34 +0000 http://www.php100.com/9/20/27511.html
探讨Session机制 | PHP基础笔记

终于迎来开学季

说在前面

    这篇文章就跟大家整理一下Session的笔记。在讲Session之前,我们先来说说为什么会有Session会话机制。

    当我们用浏览器打开一个网页时,会通过HTTP协议进行请求,我们都知道HTTP协议是无状态、无记忆的。什么叫做无状态、无记忆呢?可以这么理解:用户请求的A页面,与用户请求的B页面是没有任何关系的,互不认识,也互不关联,但是这样的请求方式的优点是快。

    这就带来了一个问题。我们一般在访问一个站点时,都希望在A页面登录后,再来到B页面时也是登录状态的,但是由于HTTP请求时无状态、无记忆的,因此两次请求时互不认识的。那怎么办呢?不可能同一个站点每个页面都要登录一次吧。

    这时,Cookie就出来了,Cookie说你的信息可以存在我这里,因此就把数据信息存在Cookie里了,(关于Cookie,我们在上一篇笔记也给大家展示出来了,Cookie这点事儿 | PHP基础入门篇)。读过这篇文章的同学都知道,Cookie它是存储在客户端的,用户可以随意修改,它不安全啊,那又咋整?

什么是Session呢?

   有同学说,既然Cookie数据它存储在客户端上不安全,那就把这些状态信息存储在服务器上呀。诶这位同学,你骨骼惊奇哦!没错,这时Session就出来了。Session可以解决在一次会话中处理两个HTTP的请求的关联,同时Session信息将存储在服务器上,如此便能解决安全上的问题。

No.1

多学一点

什么是会话?

我们拨打10086时,会话从服务台接通后开始;我们进行话费查询时,服务台响应,这是会话中的一个请求;当我们进行套餐更改时,服务台响应,这又是会话中的一个请求。挂掉电话后,会话也就结束了。

那么会话有什么特性呢?

首先,一个会话中可以也可能包含多个请求;其次,在一个会话中,发出请求的用户身份是唯一的。

在Web网页中,用户从打开浏览器的第一个页面时,会话也就开始了,用户进行各种请求后(访问各种网页),关闭浏览器后会话也就结束了。

1.Session工作原理

探讨Session机制 | PHP基础笔记

来源:图片来源于网络

说明:

    当我们第一次访问A网站时,会先进行登录的操作,在勾选记住账号密码并登录后,会进行第一次HTTP请求,服务器接到请求并验证成功后,会生成一个类似于”身份证”的Session-id,并产生一个Session文件(主要存储用于登录的账户信息等),同时也向浏览器回传Session-id,告诉浏览器存储这个Session-id到Cookie数据区里。浏览器接收到指令后,会把Session-id存到浏览器对应的COOKIE数据区,如此便完成了第一次请求和应答过程。

    当我们进行第二次(第n次)访问A网站时,同样也会进行HTTP请求,此时会携带之前存的Session-id,当服务器接到请求后,首先会根据Session-id去Session文件中寻找对应的文件,找到相应的Session文件后取出里面存储的账户信息,并与数据库的账户信息进行验证配对,以完成自动登录。至此,第二次(第n次)请求和响应过程就完成了。

No.2

多学一点

  1. 与Cookie相同,Session数据也是由服务器生成的,而不是客户端。而Session数据也将存储在服务器端。

  2. 2.与cookie可分为:敏感数据如登录信息等用session,不敏感的如营销推广类的用cookie。

2.开启Session会话

描述:启动新会话或者重用现有会话;

语法:bool session_start(void);

提示:$_SESSION 变量默认不存在的,与$_POST、$_GET、$_FILES不一样,因此,需要先开启$_SESSION,才能使用$_SESSION变量;另外,每个需要SESSION数据的页面,都需要开启SESSION功能;

注意:SESSION功能,不能重复开启(同一个页面不能开2次);

返回:成功开始会话返回TRUE,失败返回FALSE。

探讨Session机制 | PHP基础笔记

提示:SEESION文件的保存位置。

探讨Session机制 | PHP基础笔记

Session操作

1.添加SESSION数据

描述:对Session的管理(增删改查),都是通过超全局数组$_SESSION进行的;

语法:$_SESSION[key] = value

提示:一个网站不管添加多少个SESSION数据,最终在浏览器端只存储一个SESSION的ID值,该ID值是经过加密的,并且永不重复。key只能是string类型的数据。

SESSION文件在服务器端的存储位置:C:windowstemp(wamp可能存于wamp下的tmp文件夹下

探讨Session机制 | PHP基础笔记

2.读取Session数据

语法:$value = $_SESSION[key];

提示:每次SESSION操作,都要先开启SESSION功能;

探讨Session机制 | PHP基础笔记

3.删除SESSION数据

使用unset()函数,删除一个SESSION数据;

探讨Session机制 | PHP基础笔记
探讨Session机制 | PHP基础笔记
探讨Session机制 | PHP基础笔记

4.销毁SESSION文件

描述:删除当前的SESSION文件,不影响其他的SESSION文件。

语法:bool session_destroy(void)

探讨Session机制 | PHP基础笔记

SESSION对应COOKIE的配置(php.ini)

1.SESSION对应COOKIE过期时间设置

修改php.ini配置项:

session.cookie_lifetime

探讨Session机制 | PHP基础笔记

2.SESSION对应COOKIE有效路径设置

修改php.ini配置项:

session.cookie_path

探讨Session机制 | PHP基础笔记

3.SESSION对应COOKIE域名有效性设置

修改php.ini配置项:

session.cookie_domain

探讨Session机制 | PHP基础笔记

4.是否仅限HTTPS来发送SESSION对应的COOKIE数据

修改php.ini配置项:

session.cookie_secure

探讨Session机制 | PHP基础笔记

5.是否仅限HTTP来发送SESSION对应的COOKIE数据(JS是否能用)

修改php.ini配置项:

session.cookie_httponly

探讨Session机制 | PHP基础笔记

SESSION文件的垃圾回收机制

我们在上网的过程中,一般能看到,每个网站都有登录和退出。当我们登录后,完成我们自己的需求后,如果我们执行退出操作,则会执行session文件删除的操作。如果我们不退出,而是直接关闭电脑或者浏览器,则无法执行session文件的删除操作,当下一次我们再登录时,会生成另一个session文件,上一次的session文件就不能用了,因此就成为了“垃圾文件”。

1.什么是SESSION的垃圾回收机制?

1)SESSION垃圾回收机制:就是将过期的SESSION服务器文件删除的机制;

2)SESSION会自动删除那些过期的服务器端session数据区文件;

3)修改php的配置文件php.ini。

4)gc:即garbage collection(垃圾回收机制)

2.垃圾回收的周期:session.gc_maxlifetime

探讨Session机制 | PHP基础笔记

提示:每24分钟清理一次。

3.垃圾回收的概率(百分比):session.gc_divisor

回收概率:分子/坟墓,得到一个百分比。如果达到了100%就清理。

如:1/1000,每1000人访问,才会清理一次。

首先判断时间是否达到24分钟,当时间达到24分钟时,再看访问的人数是否到1000人,当人数达到1000时,则进行清理。如果时间到了24分钟,而人数不达到1000,则不清理,继续等第2个24分钟,…。

探讨Session机制 | PHP基础笔记

注意:当多人访问时,没用的垃圾文件才会清理较快。一般回收概率不要设置太小,要不然会进行频繁的清理操作,会占用服务器的资源。

]]>
http://www.php100.com/9/20/27511.html/feed 0
Homestead 安装 PHP Redis 扩展 http://www.php100.com/9/20/27504.html http://www.php100.com/9/20/27504.html#respond Mon, 02 Sep 2019 02:54:32 +0000 http://www.php100.com/9/20/27504.html

Homestead 安装 PHP Redis 扩展

虽然Laravel可以通过安装predis/predis:~1.1对Redis进行操作,但是还是想脱离框架,用PHP操作Reids,通过安装PHP Redis既可实现,以下是具体的安装步骤:

下载最新安装包

vagrant@homestead:/usr/local/src$ sudo git clone https://github.com/phpredis/phpredis.git
Cloning into 'phpredis'...
remote: Enumerating objects: 41, done.
remote: Counting objects: 100% (41/41), done.
remote: Compressing objects: 100% (34/34), done.
remote: Total 10462 (delta 19), reused 17 (delta 7), pack-reused 10421
Receiving objects: 100% (10462/10462), 6.38 MiB | 31.00 KiB/s, done.
Resolving deltas: 100% (7214/7214), done.

使用phpize命令完成php环境的检测

vagrant@homestead:/usr/local/src$ cd phpredis/

vagrant@homestead:/usr/local/src/phpredis$ sudo /usr/bin/phpize7.3 #不同php版本的情况下phpize版本不同
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

vagrant@homestead:/usr/local/src/phpredis$ sudo ./configure --with-php-config=/usr/bin/php-config7.3

编译安装

vagrant@homestead:/usr/local/src/phpredis$ sudo make && make install

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/lib/php/20180731/
Makefile:87: recipe for target '
install-modules' failed
make: *** [install-modules] Error 1

查看扩展

vagrant@homestead:/usr/local/src/phpredis$ php -i|grep extension_dir

extension_dir => /usr/lib/php/20180731 => /usr/lib/php/20180731

把redis.so扩展模块移入PHP扩展目录中

vagrant@homestead:/usr/local/src/phpredis$ sudo mv ./modules/redis.so /usr/lib/php/20180731/

添加PHP配置文件的ini文件

创建文件
vagrant@homestead:/usr/local/src/phpredis$ sudo touch /etc/php/7.3/fpm/conf.d/20-redis.ini
使用vi编辑器写入如下内容:
extension=redis.so

重启php-fpm

vagrant@homestead:/usr/local/src/phpredis$ sudo service php7.3-fpm restart

查看是否安装成功

<?php
phpinfo();
?>

如果看到Redis的扩展则安装成功Homestead 安装 PHP Redis 扩展

Homestead 安装 PHP Redis 扩展

终端无法连接homestead的Reids

1)修改redis配置文件(默认路径/etc/redis/redis.conf)
bind 127.0.0.1 修改为 bind 0.0.0.0
2)修改完配置后重启redis
执行命令sudo service redis restart后,使用redis-cli访问redisHomestead 安装 PHP Redis 扩展

Homestead 安装 PHP Redis 扩展

Homestead 安装 PHP Redis 扩展
Homestead 安装 PHP Redis 扩展
Homestead 安装 PHP Redis 扩展

长按识别二维码关注我们

]]>
http://www.php100.com/9/20/27504.html/feed 0
位运算在 PHP 实际项目当中的高级运用 http://www.php100.com/9/20/26918.html http://www.php100.com/9/20/26918.html#respond Fri, 30 Aug 2019 03:00:25 +0000 http://www.php100.com/9/20/26918.html 位运算想必软件相关专业的同学应该非常清楚。非科班专业出身的也不要着急。今天博主就带着大家一起来回顾一下这些基础知识,同时也会讲位运算在 PHP 实际项目当中的高级运用技巧。

一、位运算知识回顾

在大学的时候,我们会有一门课程《计算机组成原理》。当然,每所高校的课程名称不尽相同。这个咱们先别计较。

PHP 手册当中,专门对位运算及位运算符进行了使用介绍。

https://www.php.net/manual/zh/language.operators.bitwise.php

1) 按位与运算符:&

之所以称为位运算,指的是在运算过程中,我们会把两组需要位运算的数值进行二进制化,然后两组二进制的数字从低位向左对齐。这里的位指的是二进制数字的位置。而按位与运算符指的是两组数值每一位相与,同为 1 则 结果为 1,否则为 0。

看 PHP 示例:

echo 1 & 3; // 输出:1

为什么会输出 1 呢?

那是因为:

1 的二进制表示结果为:01。

3 的二进制表示结果为:11。

那么这两组二进制结果对齐之后的运算流程如下:

01
11
——
01

从右往左进行位运算,都 为 1 则结果为1,否则为 0。结果自然是 01。而 01 转换成十进制就是 1 。所以,输出的结果为 1。

再看一组示例吧:

echo 2 & 10; // 输出:2

我们来看看运算过程:

10
1010
——————
0010

0010 转换成十进制就是 2。

一定要记得是向左对齐。或者称为低位顺位对齐模式。

如果你不会十进制转二进制或二进制转十进制不会。那么,下面这两个方法能帮助你。

echo decbin(10); // 十进制转二进制。
echo bindec(10); // 二进制转十进制。

2) 按位或运算符:|

这个跟上面的按位与运算符稍微有一点不同:只要两组数字当中有只要有一位是 1 则结果就为 1。

看示例:

echo 2 | 10; // 输出结果:10

运算过程:

10
1010
——————
1010

1010 的十进制结果就是 10。

3) 按位异或运算符:^

这个运算符比较有意思:两组数字必须是一组 0 与 1 结果才为 1。1 与 1 和 0 与1 都是 0。

看示例:

echo 1 ^ 1; // 输出结果:0
echo 1 ^ 0; // 输出结果:1

1 ^ 1 运算过程:

01
01
——
00

1 ^ 0 运算过程:

01
00
——
01

这个很简单。没啥好说的。反正不相同就为 1,相同就为 0。

4) 其他位运算符:~、>>、<<

~ 按位取反运算符、>> 右移运算符、<< 左移运算符。它们的操作数都是一个。所以,与上面的两个操作数的位运算符有着非常明显的区别。在 PHP 实际编程当中,运用比较少。权当知识了解即可。

二、高级动用技巧

我们在上面对位运算符的知识进行了回顾。为的就是要在接下来的实际项目中怎样运用它解决实际问题。

我们首先来看一个系统中常见的需求:

有一个广告表,我们要对广告做显示控制:

  • 手动上下线。

  • 只允许 VIP 查看。

可能的表结构如下:

CREATE TABLE `finger_ad` (
`ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`ad_name` varchar(50) NOT NULL COMMENT '广告名称',
`ad_image_url` varchar(255) NOT NULL COMMENT '广告图片',
`ad_url` varchar(255) NOT NULL COMMENT '广告图片URL跳转地址',
`is_vip` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否仅限 VIP 显示',
`display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '显示状态:1显示、0隐藏',
PRIMARY KEY (`ad_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='广告表';

假如后期,我们需求更改了。需要再增加几种限制:

  • 已登录用户

  • 未登录用户

  • 30 天内未登录用户

  • 注册 30 天的用户

遇到这种限制条件的需求,开发同学是不是很伤脑筋?

可能很多开发第一反应就是在表结构增加这种新增的限制条件字段。一切看来似乎很美好。

的确,这样添加字段是最快最容易的方式。也能完成我们的需求。

但是,这样会引来如下毛病:

  • 每次增加限制条件。我们都要增加字段。这种对数据库的更动能少改就少改。毕竟,无限制的增加字段不可取。

  • 假如广告表数据量很大。大到增加一个字段需要几分钟的时候,这会给数据库服务器造成读写压力。

  • 条件越多,SQL 条件语句就会越来越长。

那么,还有没有更好的方式解决这些问题呢?

答案:有!

这就是我们今天要讲的按位与运算符的高级技巧。

我们把上面的表结构改一下:

DROP TABLE IF EXISTS `finger_ad`;
CREATE TABLE `finger_ad` (
`ad_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`ad_name` varchar(50) NOT NULL COMMENT '广告名称',
`ad_image_url` varchar(255) NOT NULL COMMENT '广告图片',
`ad_url` varchar(255) NOT NULL COMMENT '广告图片URL跳转地址',
`bit_condition` INT(11) UNSIGNED NOT NULL COMMENT '位运算条件:1-登录可访问、2-未登录可访问、4-30天注册可访问、8-30天未登录可访问、16-未消费可访问、32-VIP可访问',
`display` tinyint(1) NOT NULL DEFAULT '1' COMMENT '显示状态:1显示、0隐藏',
PRIMARY KEY (`ad_id`)
) ENGINE=InnoDB DEFAULT CHARSET UTF8 COMMENT='广告表';

我们把所有的条件都去掉了。增加了一个字段: bit_condition 。把所有的条件都组合到一个字段。

那我们此时该如何写代码呢?

比如,现在要添加如下限制条件的广告:

只允许登录用户访问或已注册 30 天用户或是 VIP 用户才允许访问该广告。

那么,这个广告的 bit_condition 该如何设置值呢?很简单,把这几个条件的位值直接相加。此时值为:37。

很多可能会很奇怪。设置为 37 ,我怎么知道是这几个值的和呢?如果对 Linux 系统权限熟悉的同学就很容易理解这种做法。实际上,这里运用了按位与运算的特性:任意组合相加的值不会重复。

这个理解起来有一定难度。我三两句也很难给你梳理明白。大家可以在网上深入挖掘一下这方面儿的知识。你只需要知道这一点特点即可。

那么,现在我们该如何写 SQL 呢?

示例如下:

SELECT * FROM finger_ad WHERE display = 1 AND bit_condition & 3 = bit_condition

这条 SQL 语句当中的 3 对应的是当前用户针对这么多条件得到的数值。如果 bit_condition位值是与 3 按位与与 bit_condition 结果相同,说明条件符合。

我们通过一个字段解决了所有条件的问题。着实得感谢按位与运算符的特性。同时也对 MySQL能支持位运算符感到开心。

那么,它有什么缺点呢?

想必有经验的同学已经看出来了。这种写法只能满足包含关系。假如要实现同时满足 3 个条件才能访问就不行了。或者,一个满足另外一个取反。

优点明显,同样缺点也很明显。大家要根据实际情况来选用。

]]>
http://www.php100.com/9/20/26918.html/feed 0
PHP开发学习|快递单号识别查询的api接口调用对接 http://www.php100.com/9/20/26908.html http://www.php100.com/9/20/26908.html#respond Fri, 30 Aug 2019 02:40:51 +0000 http://www.php100.com/9/20/26908.html 背景:  

不久前,自己对接调用实现了中通快递api的功能,发现如果换了其它快递再重新对接,岂不是会浪费太多的时间,物流这个接口是一个难题,要么需要逐一连接多家快递公司进行发货每对接一个快递公司就要开发十余个接口,开发工作量繁琐复杂。

所以选个第三方提供的快递API是最为合理的,下面给出快递鸟的api接口的设计实现。

 快递鸟

    快递鸟api实现物流即时查询

    1.首先要有一个快递鸟账号,根据对方的要求,完善用户申请。

    2.根据自己的需求,开通服务

PHP开发学习|快递单号识别查询的api接口调用对接

  3.进入“我的API接口”,根据“接口”中的开发文档了解设计需求,下载官方demo,编辑为适合自己的代码。

PHP开发学习|快递单号识别查询的api接口调用对接

【即时查询】代码实现

    1.修改官方的demo代码,我在此分离出了一个快递类,提高适用性

PHP开发学习|快递单号识别查询的api接口调用对接

  2.引入类文件,实例化并进行测试

PHP开发学习|快递单号识别查询的api接口调用对接

(注意:引用此api时,明确除传入物流单号参数外,还需要“快递公司编码”,可点击下载后存入自己设计平台的数据库,发现一点,excel表中没有京东物流却可以使用“JD”查到,估计是表格更新不够即时性)

  

 3.输出效果

PHP开发学习|快递单号识别查询的api接口调用对接

]]>
http://www.php100.com/9/20/26908.html/feed 0
PHP中session存储及删除变量的方法 http://www.php100.com/9/20/26831.html http://www.php100.com/9/20/26831.html#respond Thu, 29 Aug 2019 02:42:42 +0000 http://www.php100.com/9/20/26831.html
本篇文章主要给大家介绍PHP中session如何存储变量以及如何删除变量的。
首先大家需要了解一下,PHP中session什么意思有什么用
session中文的意思可以表示为“会话”,其本来的含义是指有始有终的一系列动作/消息,例如用户提问某个问题,然后被回答,这样一个完整的对话,就相当于一次会话。
而PHP session 变量就是用于存储有关用户会话的信息,或更改用户会话的设置。
Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
但是session会话信息是临时的,在用户离开网站后就会被删除。
如果需要永久储存信息,就需要把数据存储在数据库中。
那么下面我们就结合简单的代码示例,为大家介绍PHP中session的基础用法,存储变量以及删除变量。
一、session存储变量
当你需要将用户的信息存储到session中时,必须先开启会话。
代码示例如下:
<?phpsession_start();$name="123";$_SESSION['username']=$name;$_SESSION['password']=$name;echo $_SESSION['password'];

这里我们先开启会话,然后将变量$name存储到session中。通过echo输出,测试结果如下:

PHP中session存储及删除变量的方法

session_start() 会创建新会话或者重用现有会话。

二、session删除变量

1、使用unset()

<?php
session_start();
$name="123";
$_SESSION['username']=$name;
unset($_SESSION['username']);
echo $_SESSION['username'];

通过echo测试结果如下:

PHP中session存储及删除变量的方法

unset() 销毁指定的变量。

unset() 在函数中的行为会依赖于想要销毁的变量的类型而有所不同。

2、使用session_destroy()

session_destroy();

session_destroy() 销毁当前会话中的全部数据,但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。如果需要再次使用会话变量,必须重新调用 session_start() 函数。

本篇文章就给关于PHP中session存储变量以及删除变量的方法介绍,也是非常简单的,希望对需要的朋友有所帮助!

]]>
http://www.php100.com/9/20/26831.html/feed 0
PHP基础算法之——快速排序算法 http://www.php100.com/9/20/26830.html http://www.php100.com/9/20/26830.html#respond Thu, 29 Aug 2019 02:42:42 +0000 http://www.php100.com/9/20/26830.html 快速排序算法

描述:将待排序数组分割成二个单独的数组,其中一组数组比另一组数组小,则可分别对这两个单独数组进行快速排序,整个排序过程可以递归进行,以达到整个序列有序的目的。

/** * 快速排序算法 * @param array $array * @return array */function quick_sort($array) {    // 判断参数是否为数组,且不为空     if (!is_array($array) || empty($array)) {         return $array;     }     //判断数组是否为1个,是直接返回     $length = count($array);     if($length == 1){        return $array;    }    //声明二个空数组    $left = $right = [];    // 循环遍历,把第一个元素当做基准数    for($i = 1; $i< $length; $i++){        // 比较当前数的大小,并放入对应的左右数组中        if ($array[$i] > $array[0]) {            $right[] = $array[$i];        }else{            $left[] = $array[$i];        }    }    // 递归比较    $left = quick_sort($left);    $right = quick_sort($right);    // 合并左右数组    return array_merge($left, [$array[0]], $right);}

优点:最快排序算法

缺点:不稳定,不适合对象排序

PS:如有比较好的解决方案可以评论或者私信


Fast Sorting Algorithms

Description: The array to be sorted is divided into two separate arrays, one of which is smaller than the other. The two separate arrays can be sorted quickly respectively. The whole sorting process can be carried out recursively to achieve the purpose of ordering the whole sequence.

 /** * Fast Sorting Algorithms * @param array $array * @return array */function quick_sort($array) {    // Determine whether the parameters are arrays and not empty     if (!is_array($array) || empty($array)) {         return $array;     }     //Determine whether the array is 1 or not, and return it directly     $length = count($array);     if($length == 1){        return $array;    }    //Declare two empty arrays    $left = $right = [];    // Cyclic traversal, using the first element as a benchmark    for($i = 1; $i< $length; $i++){        // Compare the size of the current number and put it in the corresponding left and right arrays        if ($array[$i] > $array[0]) {            $right[] = $array[$i];        }else{            $left[] = $array[$i];        }    }    // Recursive comparison    $left = quick_sort($left);    $right = quick_sort($right);    // Merge left and right arrays    return array_merge($left, [$array[0]], $right);}

Advantages: Fast Sorting Algorithms

Disadvantage: Unstable, not suitable for object sorting

PS: If you have a better solution, you can comment or confide in it.

]]>
http://www.php100.com/9/20/26830.html/feed 0
我做游戏开发这八年 http://www.php100.com/9/20/26820.html http://www.php100.com/9/20/26820.html#respond Thu, 29 Aug 2019 02:42:40 +0000 http://www.php100.com/9/20/26820.html  
我做游戏开发这八年

作者 | kakashi8841

责编 | 屠敏

简述
 
这篇文章并不是想教会大家如何开发游戏,更不能教大家如何成为技术总监。而是分享我一路做开发的一些经历或心得体验。
 
与编程擦肩而过
 
2004年,初三升高中时,因为我考上市里最好的高中,因此父母兑现承诺给我买了一台电脑。那时候电脑配置还是挺好的(我记得是P4的CPU、1G内存、80G硬盘、优派的液晶显示器,还买了打印机、扫描仪)。
由于我热爱游戏,因此有了电脑之后就开始陷入于各类游戏中无法自拔。基本每天晚上通宵玩游戏,玩到凌晨5、6点睡1-2个小时,然后去上学。基本高一玩了各种游戏,然后成绩自然也是一落千丈。
到了高二的时候,因为我表姐夫是做美术设计的,因此我开始接触了Photoshop、Coredraw这两个软件。我一边瞎画着各种东西,一边想如果能让这些也动起来多好。因此开始接触了Flash。开始在网上看看各种Flash的教程,能做一些动画,能用按钮控件控制一些流程,也了解到AS2这一门语言,然后在网上找了各种酷炫的AS2代码加到自己的Flash里面,实现比如鼠标跟随的特效等等效果。这时候其实我还不会独立地写代码。
由于高中各种的不务正业。从中考数学全市前几名,到最后高考没考上重点大学,这其实也是我预料中的。因为本来我就不是一个相信运气的人。那时候我只想快点脱离高中,可以更自由做自己喜欢做的事情。因此也没有选择复读。
 
从图像设计到痴迷编程
 
入门编程
进入大学之后,我参与了好几个社团,成为各个社团网络部的成员。然后接下来的事情就是社团搞活动经常需要一些海报什么的。因此我高中自学的Photoshop和Coredraw就派上用场了。大一基本就是做了一年各种图像设计的工作。而从高中到大一带来的各种突如其来的自由,也使得我继续沉浸在各种游戏中。到了大一的暑假时,校团委突然找网络部帮忙做网站,而师兄们准备毕业的、准备考研的,都没啥时间。因此这重任落到了我一个人头上,我也不知道那么多成员为啥选中了我,也没想那么多。
我暑假放假前1个月,外加暑假2个月,整个3个月时间开始疯狂学习HTML、CSS、Javascript、PHP、MySQL,然后3个月时间从学习到开发完成了校团委的任务,制作了一个CMS网站。这三个月时间让我觉得编程原来这么有趣。
沉迷编程
接下来大二的时候我就陷入了疯狂的学习和开发之中,最疯狂的时候一天在图书馆借一本PHP的书,当天借当天看完,晚上再自己把那本书最后的例子实现了,然后第二天再去换书,就这样我很快把图书馆所有PHP的书都看完了。书中的例子也都能自己写出来。然后开始接了很多外包,也快速赚到了第一个笔记本的钱。
Java的图形编程
由于大二做了很多的网站,已经觉得有点厌倦。进入大三,刚好我们有一门Java的课程,我看到Java可以开发图形界面(Swing/Awt),因此开始转向学习Java。我大概花了2-3周把学校发的Java书看完了,并且把里面的示例也都自己敲了一遍。基本没有障碍的完成了Java的学习。但是书本里面关于图形界面的太少了,只介绍了最基本的一些控件以及做一些简单的界面。因此我开始自己在网上找各种资料。这时候室友告诉我“Java做图形不好看的,还不如C++不如C#,等等”。我就偏偏不信了,我依旧进行自己的学习和研究,而他也依旧站在他认为的鄙视链顶端鄙视我。就这样,他学习他的SSH,而我学习着不入流的Swing、Java3D等。
其实我那时候的心理:为啥你觉得他不行他就不行?我得自己实践过才知道。实践出真知,我觉得这是做技术一个很重要的特质。很多时候,很多东西大家只是凭经验人云亦云地传播,并没有亲自实践过。而我那时候还有一个心理,哪怕最后我花了很多时间之后做出来的东西确实不好看,那我也不亏,我在这个过程中肯定是能学到东西的。很多时候很多人会比较看重眼前做的事情收益如何,回收周期多长。但是我觉得,很多值得学习的知识都是回收周期很长,而且眼前收益很低的。对于我而言,我更多的是基于兴趣去学习。我觉得这就足够了。
最后的结果就是,我用Java开发出来的东西,他们觉得太好看,根本难以想象是Java发的。这里有一些大学用Java发的图形程序。
1. swing超绚丽系列一—— 俄罗斯方块(https://kakashi.blog.csdn.net/article/details/7338836)
2. 纯Java开发的游戏引擎V0.5–DEMO2 – 物理引擎(https://kakashi.blog.csdn.net/article/details/6397051)
3. 杂七杂八的东西(https://kakashi.blog.csdn.net/article/details/6181486)
就职游戏开发
 
2011,第一次面试&实习生
2011年初,不知不觉到了大四第二学期。本来我还不想这时候去找工作,因为此时我觉得还有很多事情想做,比如那时候我还在用Java自己做一个3D游戏。
但是大四寒假的时候,有个同学发了一个网页游戏公司的招聘链接给我,说这个公司还不错,我看了一下招聘要求,感觉自己符合要求,于是就顺手投了个简历。
其实投简历之前,那时候北京GLU有位前辈想让我毕业后去试试。还有另一家互联网公司也是让我毕业后去工作。主要在于我大学期间经常在各个技术QQ群里帮大家解决问题,最开始他们以为我应该工作了几年,后来知道我还在上学,因此就想我毕业后去他们公司工作。
后来肯定是我投的简历的公司让我去面试了,那天从下午2点面试到下午6点。从HR、主程序、制作人到CTO都面了。CTO面试的时候网络的BIO、NIO、多线程的安全问题如何解决也都问了。最后CTO说“你简历里写的都是Java做的图形界面,我们这Java都是做服务器,你接受做服务器吗“,我怕服务器又是做网站,于是问他”服务器也是做游戏吗“,他说“肯定是做游戏。我们做的是网游”。因此我就说“可以呀,只要是做游戏就好。”于是CTO接着说“你进我们公司肯定是没问题的,估计过几天会给你发Offer,你也不用去面试别的公司了”。
因为我个人也懒得比较,既然CTO也那么说了,我就没去面试别的公司,在同学那玩了一周,一周后就入职了。
记得那时候CTO还问过我一个问题“你说你这么喜欢写代码, 你想写到几岁”,我说“30岁吧”。他问我为啥只写到30岁。我说那时候可能我是技术总监了。就不用写代码了。后来我30岁的时候,成为了技术总监。但是我还是喜欢写代码。其实兴趣是可以一辈子的。我也不知道为啥面试那时候那么回答了。
2011,第一个游戏
刚进入工作比较紧张,总怕哪里做不好。第一周项目组说让我去改一下服务器列表。我那时候压根没有远程登陆过服务器改东西,主程就给了我IP、用户名、密码,以及网页的位置。于是我赶紧自己搜索了各种资料,在接到任务的半小时内,我第一次用SecureCRT登陆服务器,第一次用VI在服务器上修改文件。
接着几天就是熟悉项目,我在服务器上自己找到了聊天的协议入口,然后加入了一些GM,给自己的账号加了赵云、吕布这些牛逼的武将。
几天后,主程找我,说来的毕业生里面感觉你编程能力不错,你想去做新项目吗。我自然想体验从0开发游戏的过程。于是就满心雀跃地说“想!”。
新项目开发的时候我充满了激情,基本上第一周我就完成了背包系统的开发。那时候公司其他游戏的数据存储都是同步的。主程就说,这个新项目估计用户交互会比较频繁和实时,同步存储怕会卡顿。于是我那一周开发背包的时候,顺便被服务器的数据存储写了个异步的存储。(后面该功能还被公司其他那项目组引用),立项一个月后主程就去了腾讯。而我们项目本来是公司的尝试性项目(公司其他项目都是SLG,而这个项目是RPG),因此也一直得不到重视,一直得不到重视。我们这项目加上我就2个服务器,开发了半年上线了。我对游戏业务非常熟,编程基础也还行,因此开发速度很亏,一个人开发了70%的系统。那时候很多同学问我,你做那么多,公司给你加工资了没有。我说没有,他们说,那没有你为啥做那么多。
其实有的时候不是你在这个位置才能做这个事情。而是你有能力、主动地去做这个位置的事情,做多了你自然也就是这个位置的人。因为我觉得没有哪个公司会愿意付出成本让你冒险。
项目上线的时候,公司也让我成为了这个项目的服务器主程。那时候我距离实习才半年,一直怕自己做不好,因此一直很努力提升各种能力。由于我开发的功能Bug极少,而且出Bug的时候修改极快,因此项目组的测试负责人说我说最受测试欢迎的程序,直到后来她去了银汉后遇到她,她还说她在银汉和测试部说,曾经有个程序员这样这样…
写程序出BUG是常见的事情,想要减少BUG数量,要思维谨慎,业务熟悉,而想要修BUG快速,需要对所写的东西都烂熟于心,我之前经常对别人说要做到代码在心中。
如果你写的代码你内心都很清晰,那么出问题的时候,很快就能定位到问题。这就像,你的代码存在于内存中,查找肯定快。如果每次都是要去慢慢看代码文件,那就像每次都检索磁盘,肯定会慢一点。我之前好多个性能问题都是在走路和洗澡想到的解决方案,假如心中没有代码,又如何能做到呢?
2012年,第二个重量级IP游戏
12年初的时候,公司准备做一个ARPG项目,是星爷授权合作的游戏《西游降魔篇》,那时候公司从我们第一个项目的表现觉得我们项目组还是具备比较好的研发能力的,因此这个项目就给了我们项目组。
一开始公司让我做这个项目的主程序,我觉得我才毕业1年,我玩游戏很多,自知ARPG项目比我上一个RPG肯定要高。因此最开始希望公司能招一个经验丰富的主程,我可以过去学习。公司也同意了,主程入职了一直在看天堂2的源码,也拉着我看。我觉得天堂2的源码存在很多问题。比如各种在“父类中判断自己是否是某个子类”等。后来2个月过去了,连登陆都还不能登陆。因此制作人就问我,说你觉得他行不行。我也把我对天堂源码的判断说了一下。
后来制作人说,要不还是你来当主程吧。那时候我觉得也行吧。反正本来想跟一个有经验的人学东西,结果反而他老来问我各种东西,而且开发进度也很慢。于是我就答应了。然后我又重新开始搭框架。第一周花了时间把网络、副本采用的线程模型搭好了。第二周CTO带着我做了场景。第二周我们已经可以多客户端同步移动、怪物有了简单的AI和普攻了。而且我为了减少和客户端连调的不便,还自己用Swing写了一个图形界面,用于显示服务器当前地图中各个角色的位置。(所以说,假如我大学的时候很功利地觉得学习Java的图形开发性价比不高,那么这时候我肯定没法自己快速完成这个工具
这个项目我们花了9个月上线。作为公司第一个ARPG项目,其实也很快了。
项目上线后玩的人挺多,那时候单物理服导量的时候有6000人同时在线。不过这个游戏收费没有调起来。
2013年,转战手游与创业
西游降魔篇调了整整8个月都没把付费调起来,甚至越来越差。从最开始每月单服的700W变为几乎没有。此时已经是2013年中,我建议公司可以使用Unity3D(其实12年底已经说过一次,制作人说次年可以申请看看)开发手游,但是公司的战略明显还是在页游,因为公司靠页游已经做到借壳上市,不愿意也觉得没必要去踩手游的坑。公司唯一一个和手游有关的部门其实是把页游项目通过AIR发布为手游。这样出来的手游性能堪忧,而且体验也没有做针对性优化。
于是在2013年8月,我就辞职自己去创业做手游了。
自己创业肯定面临的是资金问题,短缺的资金不可能请得了很多牛人,因此我自己又开始做起了Unity3D客户端。把战斗等最核心的东西都自己扛下来。
我们2策划、2程序、1美术从立项到做完Demo花了大概3个月,然后开始拿着手机去演示DEMO,去找投资。
那时候的DEMO是用Unity3D做了一个2D游戏。因为我们唯一的美术人员比较擅长画画。Demo可以在这里看到:第一个Unity3D 的Demo(https://kakashi.blog.csdn.net/article/details/29365329)。
我们大概找了4个投资人谈,最后确定了投资。
2014-2015,第一次创业
就像上面说的,创业资金的短缺,而且那时候Unity3D人员的稀缺,导致我们想找一个牛逼的人员根本不可能,因此我只能自己扛下战斗、Shader等核心的工作。那时候白天写服务器,教新人写代码,一行行代码地边敲边讲,晚上写客户端,最疯狂的几个月基本睡公司,凌晨5、6点入睡,早上9点半起来。
那时候我用Unity3D,也只是为了为公司省成本,也没想什么太多的东西。结果也正是这段经历,使得我后来成为了另一家百人公司的技术总监。所以我还是挺相信一句话:但行好事,莫问前程!
最后创业肯定还是失败了,其实还是因为团队成员的不成熟。因此在2015年中的时候,经过了几轮调整和测试后,由于测试结果表现不理想,我们就结束了创业。我并没有对这次创业感到后悔,毕竟那是一次宝贵的经历。而且整个创业过程也都是很充实,很开心。
2015,西山居和多益网络
创业结束后我觉得想找个公司积累一下。那时候只面试了珠海西山居和多益网络,西山居剑网3项目组也希望我过去,但我觉得我就是因为懒,最后选择了继续留在广州的多益网络。我学习可以很努力,但是对于公司的选择却经常是很懒。
2016-2018,第二次创业
在多益做的时间不长,基本过了试用期,以前第一家公司的制作人就找我创业。并不是因为我个人喜欢创业,其实我只想做一个成功的游戏,能被大家认可的游戏。那时候出去创业,更多是因为这位制作人以前对我不错,也是因为他我才能刚毕业就当上主程,因此这次创业,其实更多的还是报恩。
这次创业的结果无疑还是失败的。
2018至今,360游戏艺术(岂凡网络)技术总监
2018年4月,由于以前带的一位程序的推荐,我便去了360游戏艺术担任技术总监。这时候刚好30岁,正好和刚毕业实习的时候自己说30岁可能会当上技术总监。实现了自己当初不假思索的一句话。但是回想起来,我这一路并没有为当技术总监去做任何刻意的学习与准备。只是我一路以来学习的都是自己喜欢的,做的都是自己喜欢的,而且该公司正好需要我目前拥有的能力而已。这也是我最后想和大家分享的,有的人会问怎么才能当主程,怎么才能当总监。我觉得不管当什么职位,重要的就是为公司解决问题,你能解决什么样的问题,你自然就能胜任什么岗位。而有很多舍本逐末的做法,其实看似近路,最后都是无尽的弯路。我觉得做什么都不重要,重要的应该想想,自己能为游戏这个行业做什么,平常应该怎么提升自我去成为行业真正渴求的人。
当然我从任该岗位以来,一直也觉得自己还是做的不够好,也还在一直努力提升自己。
今天正好有空,谨以此文,献给所有想为自己所在行业做点贡献的小伙伴!希望一起努力,共勉!
声明:本文已获 博主 kakashi8841 授权,版权归作者所有。
【END】
]]>
http://www.php100.com/9/20/26820.html/feed 0