1.php如何安装?
2.100种不错的源码免费工具和资源
3.å¦ä½å¨Reactä¸è°ç¨å¾®ä¿¡çjsSDK
php如何安装?
怎么安装PHP环境?
LAMP/LNMP环境搭建
一.检查系统环境
1.确认centos版本
[root@localhost~]#cat/etc/redhat-release
2.检查是否安装过apache
rpm-qa|grepf
5.卸载Apache包
rpm-qa|grep(小皮)或者bt.cn(宝塔)安装面板
如果你的服务器是Linux,建议使用宝塔
打开终端,源码不同Linux系统的源码输入指令不同:
Centos安装脚本
终端输入:yuminstall-ywgetwget-Oinstall.shshinstall.sh
Ubuntu/Deepin安装脚本
终端输入:wget-Oinstall.shsudobashinstall.sh
Debian安装脚本
终端输入:wget-Oinstall.shbashinstall.sh
Fedora安装脚本
终端输入wget-Oinstall.shbashinstall.sh
输入后进行安装就可以了
如何安装PHP模块php模块安装的方式
1、静态安装
将先将在安装php之前先将需要安装的源码程序装上,如ftp、源码mhash、源码街机联网源码mcrypt……安装完成后,源码解压php安装包,源码执行./configure
--with-ftp
--with-mhash
--wth-mcrypt等等。源码后面具体跟的源码参数可以参看./configure
--help查看。编译好后,源码执行make
make
install
就行了。源码
2、源码动态安装
而在往往我们进行编译php时经常会忘记添加某扩展,源码后来想添加扩展,源码但是因为安装php后又装了一些东西如PEAR等,不想再重新装php,于是可以采用phpize来动态加载需要安装的模块。
具体实现方法如下(这里以忘记安装pdo_mysql模块为例):
cd
/root/source/php-5.3./ext/pdo_mysql
/usr/local/php/bin/phpize
在安装完mysql后,并不是进入/root/source/mysql-5.5.目录运行phpize,而是进入php的源文件中要增加的扩展模块的文件目录---也就是/root/source/php-5.3./ext/pdo_mysql目录执行phpize。如果不是这样操作的话就会提示下面的错误:
Cannot
find
config.m4.
Make
sure
that
you
run
'/usr/local/php/bin/phpize'
in
the
top
level
source
directory
of
the
module
关于上面的这个错误,我不得不鄙视下网上有些自以为是的家伙,自认为对所有的安装操作很懂,报上面的错误的时候,去修改源代码,搞的乱七八糟,误人子弟。根本不按php官方的文档操作。
目录/root/source/php-5.3./ext/pdo_mysql
,开源bt源码在运行phpize命令前并没有configure文件,只有config.m4文件。运行phpize就生成了一个可执行的configure文件。此时就可以按照下的方法编译了:
./configure
--with-php-config=/usr/bin/php-config
(还可以加一些其他的参数,可通过./configure
--help查看)
make
make
install
编译完成后会提示扩展模块生成在/usr/local/php/lib/php/extensions/no-debug-non-zts-目录。
修改php.ini文件
vi
/usr/local/php/etc/php.ini
在其文件结尾加入下面的内容:
extension_dir="/usr/local/php/lib/php/extensions/no-debug-non-zts-"
extension=pdo_mysql.so
安装完成后,重启php-fpm和web服务器。(因为我用的是php-fpm和tengine,如果用的是apache则也重启相应的程序,重新加载就行了)
种不错的免费工具和资源
本文精选了种免费工具和资源,旨在为开发者、设计师和创意人士提供高效、实用的解决方案。以下是部分精选工具及资源的详细介绍:
1. Tabler Icons - 免费且开源的图标库,注重设计细节,帮助作品脱颖而出。
2. Remove bg - 一键移除背景的在线工具,提供%自动化服务,无需额外点击。
3. Dev Resources - 一个协作资源平台,按类别整理供开发者使用。
4. Blender - 免费的开放源代码3D创作软件,适用于各种3D项目。
5. Free Code Tools - 集合了免费的SEO和代码工具,提高工作效率。
6. Coolors - 用于生成或浏览美丽颜色组合的设计工具。
7. loading.io - 提供SVG、CSS、巴豆侠源码GIF和PNG格式的加载图标、动画文本等。
8. DevSamples - 代码样本库,方便开发者复制粘贴到项目中。
9. Lorem Picsum - 用于创建Lorem Ipsum文本的生成器。
. Netlify - 免费部署现代静态网站的平台,提供CDN、持续部署等功能。
. Pxfuel - 提供数以百万计的公共领域,适用于商业用途。
. Font Awesome - 最受欢迎的图标集之一,更新后包含更多图标、风格和选项。
. GTmetrix - 用于分析网页速度性能的免费工具,提供改进建议。
. Resume.com - 提供免费的简历生成器,帮助用户找到理想工作。
. daily.dev - 保持最新编程新闻的简易方法,整合开发者社区排名的文章。
. DevDocs - 离线且免费的文档浏览器,方便开发者快速搜索HTML、CSS、JavaScript等文档。
. Feather Icons - 简洁美观的开源图标集合,强调简单性、一致性和可读性。
. shortcode.dev - 一组有用的代码片段和示例,包含元素、订单状态源码属性和选择器。
. Canva - 与团队合作创造美丽设计的在线平台,提供拖放功能和布局选项。
. Mockuper.net - 免费模型生成器,用于定制图像展示作品。
. CSS Nectar - 为网页设计师提供免费CSS网站设计展示平台。
. BGJar - 免费的SVG背景生成器,适用于网站、博客和应用程序。
. Photopea - 在线照片编辑器,支持编辑照片、应用效果、过滤器等。
. Vercel - 为项目提供最佳前端开发体验和最高终端用户性能的部署平台。
. Fun-javascript-projects - 以实用项目形式免费学习JavaScript的资源。
. Flaticon - 包含大量免费SVG、PSD、PNG、EPS格式矢量图标,以及图标字体。
. Awesome Python - 汇总了优秀的Python框架、库和软件列表。
. CSS Reference - 以视觉指南形式免费提供CSS学习资源,包含流行属性解释。
. Sidebar.io - 每天提供五个最佳设计资源,适用于工作日。
. Grid by Example - CSS网格布局学习指南,提供所需知识。新浪新闻源码
. Heroicons - 美观的手工SVG图标,由Tailwind CSS开发者提供。
. Latency - 免费全球延迟性能测试工具。
. We Work Remotely - 提供设计、编程、营销等领域的远程工作机会。
. Unsplash - 高质量免费库,适用于任何项目。
. Simple Icons - 包含多个流行品牌免费SVG图标。
. CSS Stats - 为样式表提供分析和可视化的免费工具。
. Squoosh.app - 在线图像压缩和比较工具,支持多种编解码器。
. Fast design - 适应现代网络体验的自适应界面系统。
. UI Garage - 为设计师和开发者提供UI灵感、工具和最佳资源。
. unDraw - 具有开源插图的设计项目,可免费用于任何想法。
. Figma - 团队合作设计、制作原型和收集反馈的平台。
. Hashnode - 免费内容创作平台和社区,允许在特定领域发布文章。
. FreeCSS - 提供个免费网站模板,支持开源和创意共享模板。
. DrawKit - 免费矢量SVG插图集合,无需署名即可使用。
. Public APIs - 列出多个免费开放的REST API,涵盖**、动漫、天气等。
. CSS.gg - 纯粹的CSS图标库,支持自定义和Retina-Ready,通过纯CSS、SVG等构建。
. Jr.DevJobs - 初级开发人员的工作机会平台。
. Notion - 将日常工作应用集于一体的新工具,作为团队工作空间。
. Compresspng.com - PNG图像压缩和优化工具。
. Compressor.io - 在线图像优化和压缩工具,支持JPEG、PNG等格式。
. Caniuse.com - 提供浏览器支持信息,支持桌面和移动网络浏览器的前端技术。
. Javascript.info - 现代JavaScript教程,包括闭包、文档和事件、面向对象编程等。
. Inovatik - 为在线项目提供动力的HTML模板下载平台。
. Free-for.dev - 提供开发者使用的免费软件、服务和其他产品列表。
. Stormkit - 现代JavaScript应用基础设施提供商,与Git紧密集成。
. PythonAnywhere - 云中托管、运行和编码Python的平台。
. Regex - 在线正则表达式测试工具,支持PHP、PCRE、Python等语言。
. Quant-UX - 设计、测试和学习工具,允许将原型转换为生产系统。
. Glitch - 创建和使用数以百万计应用程序的简单、强大、免费工具。
. Frontend Mentor - 通过解决真实世界HTML、CSS和JavaScript挑战,提高前端技能。
. Smashing Magazine - 为网页设计师和开发者提供资源。
. FontPair - 协助设计师组合和匹配Google字体。
. Codewars - 开发人员挑战平台,通过训练提高技能。
. Westryve - 提供PHP、Laravel、HTML & CSS、Python、.NET等社区信息。
. Remote.co - 提供远程工作机会、公司和虚拟团队信息。
. Web.dev - 通过有用指导和分析,帮助网站和应用程序采用现代功能。
. BundlePhobia - 帮助评估前端bundle中添加npm包的性能影响。
. Scrimba.com - 有趣、快速学习代码的方式,提供互动课程和教程。
. Dev.to - 具有建设性和包容性的社交网络,支持开源和透明。
. Heroku - 平台即服务(PaaS)平台,使开发者能够在云中构建、运行和操作应用程序。
. Animista.net - 玩转现成CSS动画,调整并仅下载实际需要的动画。
. HTTP Status Codes - 定义、细节和有用的代码参考。
. The Coding Interview - 每天准备5分钟,练习破解编码面试难题。
. Learn-anything.xyz - 搜索交互式思维导图,用于学习任何内容。
. Responsively App - 帮助快速、精确进行响应式Web开发的工具。
. Colormind - 一键生成色彩组合的工具,使用深度神经网络创建有凝聚力的色彩方案。
. teachyourselfcode.io - 通过策划的视频教程免费学习代码。
. Render - 统一平台,用于构建和运行所有应用程序和网站,支持免费SSL、全球CDN、专用网络和Git自动部署。
. Carbon.sh - 最简单的方法创建和分享源代码。
. Regex Pal - 在线测试Javascript和PCRE正则表达式。
. JSONLint - 免费的在线JSON验证和重新格式化工具。
. W3Layouts - 提供免费网站模板设计,响应式设计,使用Bootstrap、HTML、CSS和JS构建。
. Freepik - 数以百万计的免费图形资源,包括矢量图、、PSD、图标等。
. Mixkit - 为视频项目提供免费视频素材、音乐素材和Premiere Pro模板。
. Unscreen - 在线工具,用于移除视频背景,%自动,免费。
. Avataaars Generator - 免费在线头像生成器,轻松制作个人头像。
. Remix Icon - 开源中性风格图标集合,适合设计师和开发者使用。
. Ikonate - 定制、调整和下载免费矢量图标,支持Sketch、Photoshop等应用程序使用。
. Open Doodles - 人物素描图库,适用于个人和商业使用。
. Kite - 用于编程自动完成的AI插件,支持多种语言和IDE,提供多行补全功能。
. Devhints - Web开发速查表集合。
. Wappalyzer - 分析网站技术栈的工具,创建网站和联系人的列表。
. Tailwind Components - 提供Tailwind图表、网格、输入、表格等组件。
. Grammarly - 旨在提升沟通影响力的工具,确保写作清晰吸引人,消除语法错误。
. Wave - 免费发票和会计软件,支持信用卡处理和工资单服务。
. Clockify - 时间跟踪软件,用于跟踪不同项目的工作时间。
. Untools - 解决问题、决策和理解系统的方法集合。
. Free Logo Maker - 在几分钟内创建自定义logo的免费在线应用。
. TinyPNG - 压缩优化PNG和JPEG图像,加快网站加载速度,节省带宽。
. 1loc - 最佳的JavaScript单行代码集合。
å¦ä½å¨Reactä¸è°ç¨å¾®ä¿¡çjsSDK
1. 微信JSSDK使ç¨æ¥éª¤ç®ä»æ们æ¢ç¶æ¯å¨ååºäºå¾®ä¿¡çå¼åï¼å½ç¶å°±ç¦»ä¸å¼å¾®ä¿¡çå¼åææ¡£äºãå¼å§ä¹åå¸æ大家è½å å»çä¸ã微信JS-SDK说æææ¡£ããé£ä¹æ们æä¹æ ·æè½ç¨ä¸å¾®ä¿¡çJSSDKå¢ï¼ä»¥ä¸åºæ¬æ¥éª¤å°±æ¯åºäºè¯¥ææ¡£çã
éè¦æ³¨æçæ¯ï¼å¦ææ¬äººä¸é¢çæè¿°ä½ ççæç¹äºéé¾éçè¯ï¼æå»ºè®®ä½ ï¼
å头çä¸æ¬ç³»åãå°ç½å¦reactãçåå²åºç¡æç« ï¼ç¹å«æ¯ãå°ç½å¦reactä¹altjsçActionåStoreã以åãå°ç½å¦reactä¹æéReact Componentä»»ç£äºèãï¼æ/åï¼
ç´æ¥è·³è¿æçæè¿°ï¼å¨æç« åé¢ä¸è½½ææ°çæºç ï¼å é 读æºç ï¼ç¢°å°é®é¢ååè¿æ¥çæç« çæè¿°ã
æ¥éª¤ä¸ï¼ç»å®åå
å ç»å½å¾®ä¿¡å ¬ä¼å¹³å°è¿å ¥âå ¬ä¼å·è®¾ç½®âçâåè½è®¾ç½®âéå¡«åâJSæ¥å£å®å ¨ååâã
å¤æ³¨ï¼ç»å½åå¯å¨âå¼åè ä¸å¿âæ¥ç对åºçæ¥å£æéã
è¿éç»å®çæ¶åéè¦æ³¨æä¸è¦å¸¦åé¢çW', accessTokenUrlin.qq.com/cgi-bin/token', ticketUrl:'com/cgi-bin/ticket/getticket',
}
exports.sign = function (url,callback) { var noncestr = config.noncestr,
timestamp = Math.floor(Date.now()/), //精确å°ç§
...
request(config.accessTokenUrl + '?grant_type=' + config.grant_type + '&appid=' + config.appid + '&secret=' + config.secret ,function(error, response, body){ if (!error && response.statusCode == ) { var tokenMap = JSON.parse(body);
request(config.ticketUrl + '?access_token=' + tokenMap.access_token + '&type=jsapi', function(error, resp, json){ if (!error && response.statusCode == ) { var ticketMap = JSON.parse(json);
cache.put('ticket',ticketMap.ticket,config.cache_duration); //å å ¥ç¼å
callback({ noncestr:noncestr, timestamp:timestamp, url:url, jsapi_ticket:ticketMap.ticket, signature:sha1('jsapi_ticket=' + ticketMap.ticket + '&noncestr=' + noncestr + '×tamp=' + timestamp + '&url=' + url)
});
}
})
}
})
}
}
è¿éçæµç¨åæ们åææè¿°ç并æ äºè´ãé¦å æ¯éè¿appIdåsecretè·å¾è°ç¨è·åjsapi_ticketçaccess_tokenï¼ç¶åéè¿è¯¥access_tokenè·å¾æ们ç¾åéè¦ç¨å°çjsapi_ticketãnoncestræ们æ¯æåé便填å好çãtimestampçç®æ³ä¹æ¯è¾ç®åãæåå°±æ¯éè¿sha1è¿ä¸ªåºæä¾çæ¹æ³ï¼å°jsapi_ticketï¼noncestrï¼timestampå页é¢urlè¿è¡sha1ç¾åï¼ç¶åå°ä»¥ä¸è¿äºä¿¡æ¯éè¿callbackè¿åç»ä¸å±è°ç¨å½æ°ã
é£ä¹æ们å¾ä¸çä¸æ们çä¸å±è°ç¨å½æ°ãå ¶å®å°±æ¯æ们çexpressè·¯ç±:
app.get("/api/signature", function(req,res) { const url = req.query.url.split('#')[0];signature.sign(url,function(signatureMap){
signatureMap.appId = wechat_cfg.appid;
res.send(signatureMap);
});
})
æ ¹æ®å¾®ä¿¡å¼åææ¡£éæ±ï¼æ们é¦å éè¦å°ä¼ è¿æ¥çurlçéç¹åé¢çæ°æ®ç»å»æï¼ä¿çåé¢çææé¨åãç¶åå°±æ¯è°ç¨ä¸é¢çsignæ¹æ³æ¥çæç¾åãä¸é¢çç¾åæ¹æ³æåä¼ è¿æ¥çjsonæ°æ®å°±æ¯è¿éçsignatureMapãæ们æç»ä¼å°è¿äºæ°æ®åéåreact客æ·ç«¯ã
åæ¶ï¼éè¿ä¸é¢çwx.configç示ä¾ï¼æ们ç¥éè¿éè¦ç¨å°å¾®ä¿¡å ¬ä¼å·çappIdãæ以è¿éä¸å¹¶å°å ¶æ¾å°signatureMapä¸è¿è¡è¿åã
é£ä¹å°æ¤ä¸ºæ¢ï¼react客æ·ç«¯è°ç¨æå¡ç«¯ç"/api/signature"è¿åçæ°æ®ç¤ºä¾å¦ä¸:
{noncestr: 'Wm3WZYTPz0wzccnW',
timestamp: ,
url: 'com/?code=kGsdxcm7F1PAFfUudkGsdr&state=',
jsapi_ticket: 'sM4AOVdWfPE4DxkXGEs8VBqyVbs-TKGYp4d_ZSQa0Q5WvvMUPNQ6XGpyEcgKOD_xID_GrMCaalSmIF9JbrGaOg',
signature: 'ffaf4b9eb0dfcfefe3daae3c'
}
3. 客æ·ç«¯è·åç¾åä¿¡æ¯3.1 è·åç¾åä¿¡æ¯å¹¶æ³¨å ¥jssdk
åä¹åçè·å微信ç¨æ·ä¿¡æ¯ä¸æ ·ï¼æ们è¿éä¼å»ºç«ä¸ä¸ªæ°çSourceæ件WechatSdkSource.jsæ¥è°ç¨è¿ç¨æå¡å¨ç"/api/signature"æ¥å£:
var WechatSdkSource = {fetchSignatureMap() { return {
remote(state,url) { return co(function *() { let signatureMap = null; const getSignatureMapUrl = `/api/signature`; try { let result = yield request.get(getSignatureMapUrl).query({ url:url});
signatureMap = result.body;
} catch (e) {
signatureMap = null;
} //console.log("userInfo:", userInfo);
return signatureMap;
});
},
local() { // Never check locally, always fetch remotely.
return null;
}, success: WechatSdkActions.updateSignatureMap, error: WechatSdkActions.getSignatureMapFailed, loading: WechatSdkActions.getSignatureMap,
}
}
};
è¿éä¼ è¿æ¥çurlç±ä¸é¢å°è¦è°åçä¸å±å½æ°æçæãæ´ä¸ªæµç¨å°±æ²¡æä»ä¹å¥½è¯´çäºï¼è¯´ç½äºå°±æ¯éè¿ç¸åºçåºåéä¸ä¸ªå¸¦æurlçqueryåæ°ç请æ±å°æå¡å¨ç«¯æ¥è¯·æ±ç¾åä¿¡æ¯ï¼ç¸ä¿¡æè·çè¿ä¸ªç³»åæç« çæåé½æ¯å¾æ¸ æ¥çäºãæç»è¯·æ±æåè¿åçæ¶åå°±ä¼è°ç¨WechatSdkActionsçupdateSignatureMapè¿ä¸ªActionã
var alt = require('../alt');module.exports = alt.generateActions( 'updateSignatureMap', 'getSignatureMap', 'getSignatureMapFailed',);
èè¿ä¸ªactionå°±ä¼è§¦åæçå¬çWechatSdkStoreçonUpdateSignatureMapè¿ä¸ªåè°ãclass WechatSdkStore { constructor() { this.signatureMap = []; this.errorMessage = null; this.ready = false; this.bindActions(WechatSdkActions); this.exportAsync(WechatSdkSource);