找到
295
篇与
易航
相关的结果
- 第 23 页
-
PHP异步协程开发:优化邮件发送的速度与稳定性 在现代的互联网应用中,邮件发送是一个非常重要的功能,无论是用户注册验证、订单确认还是密码重置等等,都离不开邮件的发送。然而,传统的同步邮件发送方式在处理大量邮件发送时往往效率低下且不稳定。为了解决这个问题,我们可以使用PHP的异步协程开发,通过并发发送邮件,提高发送速度和稳定性。 本文将详细介绍使用PHP异步协程来优化邮件发送的方法,并通过具体的代码示例来说明。 一、PHP异步协程简介 PHP异步协程是指通过利用事件循环机制,将多个任务并发执行,以提高应用程序的执行效率。在传统的PHP开发中,我们通过多线程或多进程来实现并发处理,但这种方式会增加系统资源的开销。而PHP异步协程则通过单线程来同时处理多个任务,不会引起资源开销过大的问题。 二、优化邮件发送的原理 传统的邮件发送方式是同步的,即每发送一封邮件,都要等待邮件发送完成后再发送下一封。这样一来,当需要发送大量邮件时,会花费很长的时间,而且容易造成服务器的负载过大。 而通过PHP异步协程开发,我们可以将邮件发送任务封装成一个异步协程,然后一次性并发发送多个任务,提高发送效率。同时,由于使用了异步协程,可以避免等待发送完成的时间,从而提高整体的稳定性。 三、使用PHP异步协程发送邮件的代码示例 下面是一个使用PHP异步协程发送邮件的代码示例: use SwooleCoroutine; use SwooleCoroutineChannel; use PHPMailerPHPMailerPHPMailer; function sendMail($to, $subject, $body) { go(function () use ($to, $subject, $body) { $mail = new PHPMailer; $mail->isSMTP(); $mail->Host = 'smtp.example.com'; $mail->SMTPAuth = true; $mail->Username = 'username'; $mail->Password = 'password'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('from@example.com'); $mail->addAddress($to); $mail->Subject = $subject; $mail->Body = $body; if ($mail->send()) { echo "发送成功 "; } else { echo "发送失败:" . $mail->ErrorInfo . " "; } }); } $channel = new Channel(); go(function () use ($channel) { for ($i = 1; $i <= 100; $i++) { $channel->push(["to@example.com", "测试邮件{$i}", "这是一封测试邮件"]); } $channel->close(); }); go(function () use ($channel) { while ($data = $channel->pop()) { sendMail($data[0], $data[1], $data[2]); } }); Coroutine::create(function () { Coroutine::sleep(1); // 等待所有邮件发送完成 swoole_event_exit(); // 退出事件循环 });上述代码首先定义了一个 sendMail 函数,用于发送邮件。在 sendMail 函数内部,我们使用了 PHPMailer 库来实现邮件的发送。在异步协程中发送邮件时,需要等待邮件发送完成的时间,因此我们使用了协程的方式来进行处理,保证发送的效率。 然后,我们创建了一个 Channel 通道,将待发送的邮件信息推入该通道,并在另外一个协程中进行发送。 最后,我们使用协程的方式来等待所有邮件发送完成,并退出事件循环。 四、总结 通过使用PHP异步协程开发,我们可以优化邮件发送的速度和稳定性,提高应用程序的性能和响应能力。同时,异步协程的使用也能减少服务器资源的开销,更好地满足用户的需求。 当我们在开发邮件发送功能时,可以参考上述的代码示例,并根据实际需求进行相应的调整和优化。希望本文对广大开发者在优化邮件发送方面有所帮助。
-
唐山大地震中的阴兵借道 故事背景 唐山大地震:发生于1976年7月28日3点42分53.8秒,7.8级地震。共造成24.2万多人死亡,此次地震是20世纪干大自然灾害之一。 四十年前正好是1976唐山大地震,中国人都应该知道这场大地震,可以算是中国近代以来震级最大的一场地震了,在那场地震当中死去的人就有十多万,这就相当于半个南京大屠杀,一座城市瞬间就被夷为平地,可想而知这场地震的威力了。 当时地震完以后,消息瞬间就传遍了整个中国,当时中国立刻动用了军队进行救援。 故事描述 1976年7月28日,凌晨三点四十二分,河北省唐山市发生了史无前例的7.8级大地震,刹那间,唐山交通,供水供电通讯全部中断。地震后发生的第一时间,某集团军下辖部队接到了上级命令救援。这支部队接到命令后,连忙调动几十辆军车火速奔往唐山。可就在他们距离唐山灾区还有一个小时路程的时候,却发生了一件诡异的事情。 几十辆汽车竟然在同一时间全部抛锚。且无论随行的技术人员如何检查,都找不到汽车抛锚的原因所在。面对这样的情形,救灾部队困惑不已,连忙将此事向上汇报。到了当天晚上,大约八点钟的时候,所有汽车的大灯竟又都在一瞬间全部熄灭。不过好在与此同时,这支部队也终于接到了命令,让他们把汽车都推到路的一边,让出一半道路。然后全体人员上车,无论看到什么都不许说话和乱动。 虽然上面的命令让人一时间摸不着头脑,但作为军人,他们还是在第一时间里执行了命令,把汽车全部推在了路的右边,然后上车坐着,就这样一直到了深夜,在大家半睡半醒的时候,突然被一阵马蹄声惊醒。 图片 大家看见从他们的车旁掠过一辆又一辆的马车,这些马车都是从唐山灾区方向过来,且每辆车上都点着一盏发着绿色光亮的灯。可奇怪的是,马车上并没有赶车的人,而且每辆车上都堆满了人头,这些人头有男有女,有老有少一个个表情痛苦。 看到这一幕,大家都被吓得够呛,但想起之前的命令,让他们无论看到什么都不许说话和乱动,大家也就只能大气都不敢喘上一声,有人好奇在心中默数了一下,发现这支车队的马车数量竟然多达一百多辆,而这些马车与军车擦肩而过的时间总共有十来分钟。 随着时间的推移,当这些马车队慢慢消失不见的时候,神奇的事情再次发生,所有军车的大灯竟又在同一时间恢复,且所有故障都已经自行恢复。后来当这次事件被传开以后,有人说这就是传说中的阴兵借道。 故事科普 所谓阴兵借道,是指传说中地府的阴兵出现在阳间的道路上,因为阴兵属于阴间,是不允许擅入阳间的。 六道轮回,永无止境,生命在不停的轮回。俗话说人死则为鬼,而鬼又而投胎,继而为人。如此循环,生生不息。 鬼从一定意义上来说也是一种生命,只不过目前我们尚未发现和认可而已。鬼就像人一样,也需要一种中介来对其管理。 这种东西人们称为阴兵,也有人叫做鬼差。鬼差是专门对死去的灵魂进行管理的,通俗来说也就是招魂,它们的工作和传说中的牛头马面是差不多的。 阴兵具有很大的气场,也就是说阴气很强,如果说碰上的人没有足够的阳气的话,那个人的魂就会被勾走。 所以有句古说阴兵过道,生人让路。 所以有人说,半夜三更最好不要去那些阴气比较重的地方,否则遇上一些不该看的东西,能让人后悔一辈子。 阴兵有的时候是人类死去的军队,而有时候又是一些令人恐怖的东西。也有人说,人类军队的阴兵没有勾魂,只有那些来自阴间的鬼差才会勾魂。 但无论是哪种阴兵,都只有一个原则,千万不要碰上。 温馨提示 本内容未经证实,纯属虚构,大家切勿当真,当故事听即可
-
规避邪祟的自我暗示 - 服装的辟邪与驱鬼 中华文化以其源远流长、丰富多元、广袤无垠、蓬勃旺盛的生命力而闻名于世。于璀璨辉煌的中华文化之中,鬼怪文化因其独特的神秘特质占据着别具一格的地位。 在中国鬼灵文化里,对于鬼的描绘存在善恶之别。不管是善鬼还是恶鬼,其现身皆具恐怖之态。然而,人对鬼最为惧怕的,乃是担忧其“勾魂”。 图片 既然主宰精神意识的魂被勾去,那人也就宣告终结。正因为古人笃信鬼具备勾魂害人之能,故而对其满怀恐惧。 依着相生相克之原则,玄奥谲诡的鬼怪自然存有应对之策,并被古人归结梳理为一种特殊的文化——辟邪。 图片 只需略微留意中国的历史以及现今的民众生活,便能察觉辟邪的对象、器物、仪式是那般丰富繁杂,而人们辟邪的观念、心态、行为又是那样高深莫测,引人探究。 俗语云:“十里认人,百里认衣”,人的服饰装扮虽属外在表象,却反映着丰饶的社会文化内涵,标识着某种特定的社会心理与习惯,单单在服装方面,驱邪避祟便有着诸多规约。 图片 服饰与灵魂 古人认为服饰与灵魂紧密相连、不可分割,衣服往往是灵魂的栖息之所之一,因而要如同守护灵魂一般守护好衣服。 衣服需时常置于太阳底下晾晒,并要在日落之前收回妥善藏好。只因鬼魂惧怕太阳,经过太阳的照射,所有鬼魂皆无处遁形,如此便能规避鬼祟对灵魂的侵扰。 民间忌讳将小孩的衣物在夜间晾置室外而不收回,唯恐沾染贼星或鬼祟邪气。据说夜间多鬼鸟,恐玷污衣物,致使幼儿患病。 图片 《荆楚岁时记》言,有一种鬼车鸟,能够进入人家收取人魄之气,倘若让其侵袭幼儿夜间露天的衣物,幼儿的灵魂就会被其掳走。 台湾一带亦存在夜间不晾衣的习俗,据说主要是规避两样东西。 一是规避温、热、风、寒、惊、积、饿、饱八邪之害;二是规避姑获鸟,传说此鸟夜飞昼藏,乃是鬼祟的化身,且无子嗣,喜好夺取他人之子抚养,如夜间晾在外的小儿衣服被其撞见,便会取走此儿。 图片 明清时期南方沿海一带忌讳晾晒干的衣服不收下叠好放置一段时间,就直接穿于身上。民俗以为如此会变成「竹竿鬼」。 由于当地人晒衣服是用竹竿将衣服撑穿起来,看上去像是一个竹竿人穿着似的。倘若取下来直接穿于身上,唯恐自己会受到那竹竿人灵魂的侵扰从而成为一个竹竿鬼。 而收下衣服,再加以折叠,放置一段时间,便能起到化解的效用,不会再有任何不祥之事发生。 在厌胜、巫术盛行的中国古代,妥善收藏衣服成为辟邪的一项重要举措。倘若自己的衣服落入歹人之手,那歹人便能通过服饰施行巫术,使其遭受厄运。 图片 红衣 汉民族在穿衣方面崇尚红色,民间观念认为:红色的衣饰皆具辟邪消灾之神奇魔力,均可充当辟邪与镇妖之物。 年轻女性身着红装,能够避免被鬼怪捉去做妻子;小孩子穿上红衣、红裤、系上红兜兜,便可免受鬼神侵扰;病人头上缠一块红布条,能够防止病魔缠身。 倘若正值你的本命年,就务必要系一根红带子在身上,否则阎王便会找你清算,不是遭遇灾祸就是面临困境,有了红色的衣饰,你便能顺遂地度过本命年…… 图片 当然,还有另外一种说法,这需从“阴曹地府”谈起。 古人深信人死后灵魂有其继续活动的所在之地,即 “阴间” “阴曹”。相较于阴森的 “阴间” ,人所生活的空间则称为 “阳间” “阳世”。 通常情况下,人、鬼之间无法相互往来,但在夜晚和阴暗之处,游魂野鬼常常会闯入阳间作祟。故而,阴阳之间的交界标志乃是太阳,其象征着阴阳两界。 图片 在旭日东升之前,所有鬼怪都得仓惶逃窜,所以太阳是鬼最为惧怕的事物。 而红色的衣饰看上去与太阳相似,将其裹于人的身躯之上,鬼见了仿若见到太阳和火焰,不敢靠近,如同躲避太阳和火焰一般躲避红色衣饰。 因而红色衣饰便具有了辟邪的魔力。红色衣饰辟邪虽带有迷信色彩,然而它反映了汉民族对太阳和火的尊崇,对光明的不懈追求。 图片 凶色不衣 中国人常将白、黑两色视作凶色,俗以为身着黑、白衣饰会致使丧事发生,会招来阴间的鬼魂——黑无常、白无常来勾魂。 因此,为了辟邪,民间极度忌讳身着黑、白两色衣服。不穿黑白两色衣服能辟邪的心理,与丧事所穿的黑白孝衣直接相关。由于居丧期间的垩室、丧服以及挽联等皆为黑、白两色,所以黑、白两色之物被视作死人的征兆、丧事的标识。 图片 《礼记》记载:“为人子者,父母健在,冠衣不能素。”又有:“素服,以送终也。”这表明此时民间已存在视白色衣饰为不吉的讳忌心理。 故而婚寿喜事皆适宜红色,日常生活也切忌身着白衣。古时常有此类之事,当某家操办喜事时,其仇家便送来白布、白帏、白衣服,以此破坏对方的喜气,使对方遭受灾祸。 图片 《风俗通》载,不能用盖棺材、灵牌的白帏帐来做衣服。倘若用帏帐做衣穿,就会浑身长满癞疮,极为不吉利。 由于孝服的颜色有时为黑色,民间通常也忌讳穿着,总要与其他颜色搭配着穿。做寿衣的布料不能是黑色的,寿衣一般为蓝色等。 图片 民间认为穿黑衣会使死者转生为驴。 有些地方则解释为人死后要上剥衣亭,若仅穿了黑衣,剥衣鬼定会将皮肉剥烂。所以应当穿着其他颜色的衣服。 汉族认为黑色属阴,身着黑色衣会招惹鬼魅、神灵。为防范凶险祸患,一般也不能穿黑色。 图片 衣料考究 《清稗类钞》称:“夏不得服亮纱,恶见其肤”。 古人有着用质地粗厚的布料做衣服的风俗,坚信厚衣服能保精安神,辟邪御病。他们认为当自己的肌肤被别人看到时,灵魂就被别人控制了,肉体就被别人占有了。 更有甚者,鄂温克族尚穿黄色皮衣,即使是白色的皮衣也要染成黄色的才穿,据说这样可以防止凶患。 图片 衣饰材料禁忌辟邪方面的事例也很多。民间做寿衣,那是绝对禁用缎子布料的。 因为缎子有“断子绝孙”的谐音。有些地方做寿衣忌用洋布,因为洋与阳谐音,洋布做的寿衣会使亡灵不得安宁,以致跑回家中作祟。 满族人禁衣狗皮,忌戴狗帽,否则被视为必有大难。传说狗曾救过努尔哈赤的命,狗被看作有功劳、有神力的崇拜物。民间还有不以做帷帐的布料做衣服的风俗。 《风俗通义》说:“俗说帷帐布不可作衣,令人病疠”。 因为帷帐是幽灵的藏身之所,要想辟邪就应禁用帷帐布料做衣服。 图片 妇女儿童 妇女儿童在传统的民俗观念中,对于邪祟的防卫力量很脆弱,因此人们对儿童、妇女设想了许多的辟邪措施,其中之一就是服饰辟邪。 民间认为用来做襁褓的布和被褥,一般要用旧的而不能用新的,据说新布会损伤婴儿。最好是用高寿老人的旧裙袄做襁褓,这样可保婴儿长寿。 图片 襁褓又不能太厚,据说太厚会使婴儿生疮,或令婴儿体弱畏寒。襁褓被婴儿便溺弄脏,不能洗完后搭在高处晾晒,也不要夜晚不收回室内,否则会遭鬼祟、伤害婴儿。 新生儿洗完澡,只能穿小褂子,不要穿裤子,否则就会使婴儿活不到一百天,死后到阴间也会被裤子绊住脚,而不得超生。 图片 浙江温州一带俗信小儿穿红衣会招邪祟,如果小孩穿了红色衣裤,外边还要罩上网衣、佩带虎爪或特别的腰带以辟邪恶。 中原一带俗信幼儿衣物过夜不收会遭鬼魂侵袭,夺幼儿灵魂。 景颇族则认为不能用筒裙直盖熟睡的小孩,否则附在筒裙上的大人的灵魂会伤害幼儿的魂魄,令幼儿永远睡不醒。 中国古代关于女子衣饰辟邪的主要原则,是要穿得严严实实,不能裸露肉体。否则肉体被人看见,灵魂就失去了自由,毫无自卫能力,只能听人摆布。 图片 在孟姜女的传说故事中,万喜良为逃避修长城的苦役,跳进了孟姜女的家院,正巧看见孟姜女卷起衣袖洗胳膊,于是孟姜女只好做了万喜良的妻子。 另一方面,女子的衣服,特别是内裤,对别人来说又是一种“晦气”,因此不能晾晒在路口,也不能放在男人的衣服之上,否则会使男人倒霉。 放衣物也要把男人的衣服放在上面,切忌女人的衣服、鞋袜放在男人的衣物上面,否则男人就会因此而“失运”。 图片 就某种意义而言,辟邪可视为特定的民族文化、审美情趣、社会心理的外观表现。 然而,辟邪现象这种十分丰富的文化载体,长期被简单地斥为迷信而遭到学界的忽视,而其在现代中国人的日常生活里,却有着顽强的生命力。
-
使用JavaScript动态生成网站文章目录及内容滚动跟随效果 由于之前使用的文章导读插件性能过于臃肿,导致资源消耗高且难以维护,因此我决定自行开发一个轻量级的文章导读功能。参考了郄郄私语的 案例文章,我实现了以下四个主要功能: 根据文章内容自动生成目录 点击目录跳转至相应章节 滚动阅读时,目录随当前章节自动切换 目录跟随文章内容滚动 目标 本文旨在实现以下功能: 自动生成文章目录 点击目录跳转至对应章节 目录根据当前阅读章节自动高亮 目录随文章内容滚动 根据文章内容自动生成目录 实现自动生成目录的前提是文章内容须有清晰的层次结构,这需要使用 h1 至 h6 标签来定义标题。通过 JavaScript,我们可以提取这些标题来生成目录: var articleTitleList = $('.joe_detail__article').find('h1, h2, h3, h4, h5, h6'); articleTitleList.each(function() { const headingLevel = $(this).prop("tagName").toLowerCase(); const headingName = $(this).text().trim(); console.log(headingLevel, headingName); $('#catalogs').append(`<div class="catalog catalog-${headingLevel}">${headingName}</div>`); });在样式表中为目录项定义缩进样式: .catalog-h2 { margin-left: 1em; } .catalog-h3 { margin-left: 2em; } .catalog-h4 { margin-left: 3em; } .catalog-h5 { margin-left: 4em; } .catalog-h6 { margin-left: 5em; }点击目录跳转至对应章节 点击目录跳转至相应章节可以通过为每个标题添加锚点。我们将在 h1 至 h6 标签上添加 id: articleTitleList.each(function() { const headingName = $(this).text().trim(); const enHeadingName = encodeURIComponent(headingName); $(this).attr('id', `${enHeadingName}`); $('.posts-nav-lists>ul').append(`<li><a href="#${enHeadingName}">${headingName}</a></li>`); });目录自动切换至当前章节 为了让目录随着阅读位置自动切换,我们将监控用户的滚动位置并依据此更新目录的高亮条目: const catalogTrack = () => { let $currentHeading = $('h1'); articleTitleList.each(function() { const $heading = $(this); if ($heading.offset().top - $(document).scrollTop() > 20) return false; // 退出条件 $currentHeading = $heading; }); // 更新目录状态 const anchorName = $currentHeading.attr('id'); $('.posts-nav-lists>ul>li').removeClass('active'); $(`#title-${anchorName}`).parent().addClass('active'); };目录随文章内容滚动 为确保当前章节始终可见,我们控制目录区域的滚动: if ($catalog.length > 0) { $('.posts-nav-box').scrollTop($catalog[0].offsetTop - 50); // 确保可见 }性能优化 为了避免在滚动时频繁调用 catalogTrack 导致性能降低,我们可以使用函数节流技术: function throttle(fn, wait) { let lastTime = 0; return function() { const now = Date.now(); if (now - lastTime >= wait) { fn.apply(this, arguments); lastTime = now; } }; } window.addEventListener('scroll', throttle(catalogTrack, 500)); // 每500毫秒调用一次自定义跳转行为 考虑到固定导航条可能遮挡目标章节,我们可以自定义跳转行为,确保目标元素不会被遮挡: document.querySelectorAll('.posts-nav-lists>ul>li>a').forEach(link => { link.addEventListener('click', (event) => { event.preventDefault(); // 阻止默认跳转 const targetId = link.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); const headerHeight = document.querySelector('.joe_header').offsetHeight; const scrollTop = $(targetElement).offset().top - headerHeight - 10; window.scrollTo({ top: scrollTop, behavior: 'smooth' }); }); });总结 本文记录了生成和控制博客文章目录的思路与方法,针对不同需求可能会有其他解决方案。欢迎大家在评论区讨论和分享建议,感谢阅读! 完整代码示例 HTML 部分 <section class="joe_aside__item posts-nav-box"> <div class="joe_aside__item-title"><i class="fa fa-list-ul"></i><span class="text">文章目录</span><span class="line"></span></div> <div class="joe_aside__item-contain"> <div class="posts-nav-lists"><ul class="bl nav"></ul></div> </div> </section>JavaScript 部分 var articleTitleList = $('.joe_detail__article').find('h1, h2, h3, h4, h5, h6'); if (articleTitleList.length > 0) { // 目录生成及事件绑定 (function () { for (let heading of articleTitleList) { const headingLevel = heading.tagName.toUpperCase(); const $heading = $(heading); // console.log($heading); const headingName = $heading.text().trim(); const enHeadingName = encodeURIComponent(headingName); $heading.attr('id', `${enHeadingName}`); $('.posts-nav-lists>ul').append(`<li class="n-${headingLevel}"><a id="title-${enHeadingName}" href="#${enHeadingName}">${headingName}</a></li>`); // const anchorName = $heading.attr('id'); // console.log(headingLevel, headingName); } if (Joe.IS_MOBILE) { $('.joe_action').append(`<div class="joe_action_item posts-nav-switcher"><i class="fa fa-list-ul"></i></div>`) let joe_aside = $('.joe_aside .joe_aside__item.posts-nav-box .joe_aside__item-contain').html(); $('.joe_aside .joe_aside__item.posts-nav-box').remove(); let html = document.createElement('div'); html.className = 'posts-nav-box'; html.innerHTML = joe_aside; // console.log(html); $('.posts-nav-switcher').append(html); $('.joe_action_item .posts-nav-box').css({ 'position': 'absolute', 'display': 'none', 'right': '50px', 'bottom': '0px', 'padding': '15px', 'border-radius': 'var(--radius-wrap)', 'box-shadow': '0 0 10px 8px var(--main-shadow)', 'overflow': 'auto', 'max-height': '50vh', 'max-width': '80vw' }) $('.joe_action_item.posts-nav-switcher').click(() => { $('.joe_action_item.posts-nav-switcher .posts-nav-box').fadeToggle(200); }); } const catalogTrack = () => { // console.log('页面滚动标题监听'); let $currentHeading = $('h1'); for (let heading of articleTitleList) { const $heading = $(heading); if ($heading.offset().top - $(document).scrollTop() > $('.joe_header').height()) { break; } $currentHeading = $heading; const anchorName = $currentHeading.attr('id'); const $catalog = $(document.getElementById(`title-${anchorName}`)).parent(); if (!$catalog.hasClass('active')) { $('.posts-nav-lists>ul>li').removeClass('active'); $catalog.addClass('active'); } if ($catalog.length > 0) { if ($('.posts-nav-box .joe_aside__item-contain').length > 0) { $('.posts-nav-box .joe_aside__item-contain').scrollTop($catalog[0].offsetTop - 50); } else { $('.posts-nav-box').scrollTop($catalog[0].offsetTop - 50); } } else { $('.posts-nav-lists').scrollTop(0); } } }; /** * 函数节流,时间戳方案 * @param {*} fn * @param {*} wait * @returns */ function throttle(fn, wait) { var pre = Date.now(); return function () { var context = this; var args = arguments; var now = Date.now(); if (now - pre >= wait) { fn.apply(context, args); pre = Date.now(); } } } window.addEventListener('scroll', throttle(() => { catalogTrack(); }, 500)); // 监听文章目录a标签点击 document.querySelectorAll('.posts-nav-lists>ul>li>a').forEach(link => { link.addEventListener('click', (event) => { event.preventDefault(); // 阻止默认跳转行为 // 获取目标元素 ID const targetId = link.getAttribute('href').substring(1); const targetElement = document.getElementById(targetId); if (targetElement) { // 获取目标元素距离页面顶部的距离 const targetTop = $(targetElement).offset().top; // console.log(targetTop); // 获取顶栏高度,考虑动态高度变化和内部元素 const headerHeight = document.querySelector('.joe_header').offsetHeight; // 计算滚动位置 const scrollTop = (targetTop - headerHeight) - 10; // 预留10px的美观距离 window.scrollTo({ top: scrollTop, behavior: 'smooth' }); } else { console.error('目标元素未找到:', targetId); } }); }); }()) } else { $('.joe_aside__item.posts-nav-box').remove(); }通过以上修改,文章的可读性、结构性和实用性得以提升,使读者能够更好地理解和使用所提供的功能。
-
三十六计完整详解 三十六计,一计一集,计计相扣,在展现中国古代兵法和东方智慧的同时,浓彩重墨描绘出一幅二千年前中国战国时期政治、军事与各阶层不同的人物情感相交融的历史画卷。 三十六计图片 胜战计 第一计:瞒天过海 备周而意怠,常见则不疑,阴在阳之内,不在阳之对。太阳,太阴。 译:认为准备万分周到,就容易松劲;平时看惯了的,就往往不在怀疑了,秘计隐藏在暴露的事物中,而不是和公开的形式相排斥。非常公开的往往蕴藏着非常机密的。 第二计:围魏救赵 共敌不如分敌,敌阳不如敌阴。 译:树敌不可过多,对敌要各个击破,对现在还不忙于消灭的,要隐藏我们的意图。 第三计:借刀杀人 敌已明,友未定,引友杀敌,不出自力,以损推演。 译:作战的对象已经确定,而朋友的态度还不稳定,要诱导朋友去消灭敌人,避免消耗自己的力量。 第四计:以逸待劳 困敌之势,不以战,损刚益柔。 译:控制敌方力量发展的命脉来扼杀他,而不采取进攻的形势,这就是“损刚益柔”原理的演用。 第五计:趁火打劫 敌之害大,就势取利,刚决柔也。 译:敌方的危机很大,就乘机取利,用优势力量攻击软弱的。 第六计:声东击西 乱志乱萃,不虞“坤下兑上”之象;利其不自主而取之。 译:敌人乱撞瞎碰,摸不清情况,这是《易经》“萃”封上所说的“坤下兑上”的混乱征状。必须利用敌方失去控制力的时机加以消灭。 敌战计 第七计:无中生有 诳也,非诳也,实其所诳也。少阴,太阴,太阳。 译:无中生有是运用假象,但不是弄假到底。而是使假象变真象,大小假象,掩护真象。 第八计:暗渡陈仓 示之以动,利其静而有主,“益动而巽”。 译:故意暴露行动,利用敌方固守的时机,便主动偷袭。 第九计:隔岸观火 阳乖序乱,阴以待逆,暴戾恣睢,其势自毙。顺以动豫,豫顺以动。 译:敌人内部分裂,秩序混乱,我便等待他发生内讧,那时敌人穷凶极恶,翻目仇杀,势必自行灭亡。我要根据敌人变动作好准备;作好准备之后,还要根据敌人的变动而行动。 第十计:笑里藏刀 信而安之,阴以图之,备而后动,勿使有变:刚中柔外也。 译:使敌人相信我方,并使其麻痹松懈,我则暗中策划,充分准备,一有机会,立即动手,使他来不及应变,这是暗中厉害,表面柔和的策略。 第十一计:李代桃僵 势必有损,损阴以益阳。 译:当局势发展有所损失的时候,要舍得局部的损失,以换取全局的优势。 第十二计:顺手牵羊 微隙在所必乘,微利在所必得。少阴,少阳。 译:微小的漏洞必须利用,微小的利益,也必须获得。变敌人小的疏忽,为我方小的胜利。 攻战计 第十三计:打草惊蛇 疑为叩实,察而后动,复者,阴之媒也。 译:有怀疑的就要侦察实情,完全掌握了实情再行动。反复侦察,是发现暗藏敌人的因素。 第十四计:借尸还魂 有用者不可借,不能用者,求借,借不能用者而用之。匪我求童蒙,童蒙求我。 译:有用的不可以利用,怕的是我不能控制它,不能利用的却要去利用,因为我完全可以控制它,利用不能用的而控制它,这不是我受别人的支配,而是我支配别人。 第十五计:调虎离山 待天以困之,用人以诱之,“往蹇来返”。 译:等待天时对敌方不利时再去围困他,用人假象去诱骗他“往前有危险,就返身离开”。 第十六计:欲擒故纵 逼则反兵,走则减势,紧随勿迫。累其气力,消其斗志,散而后擒。兵不血刃,需,有孚光。 译:逼得敌人无路可走,就会遭到坚决的反扑;让他逃走,就会消灭敌人的气势,所以要紧紧地跟踪敌人,但不要逼迫他,借以消耗他的体力,瓦解他的士气,等他的兵力分散了,再行再以捕捉。这样用兵可以避免流血,不逼迫敌人,并让他相信,这对战争是有利的。 第十七计:抛砖引玉 类以诱之,击蒙也。 译:用类似的东西去迷惑敌人,使敌人遭懵上当。 第十八计:擒贼擒王 摧其坚,夺其魁,以解其体;龙战于野,其道穷也。 译:彻底地摧毁敌人的主力,抓住他的首领,借以粉碎他的战争机构,这是一场激烈的总决战。 混战计 第十九计:釜底抽薪 不敌其力,而消其势,兑下乾上之象。 译:力量上不能战胜敌人,可以瓦解他的气势,这就是《易经》兑下乾上的《履卦》上所说的“柔履刚”的办法。 第二十计:混水摸鱼 乘其阴乱,利其弱而无主,随,以向晦入宴息。 译:乘着敌人内部混乱,利用他还是弱小而没有主见,他随从我,像人随着天时吃饭、休息一样。 第二十一计:金蝉脱壳 存其形,完其势;友不疑,敌不动;巽而上蛊。 译:保存阵地的原形,造成强大的声势,使友军不怀疑,敌人也不敢贸然进犯,而我却可以隐蔽地击破另一支敌军。 第二十二计:关门捉贼 小敌困之,剥,不利有攸往。 译:对弱小的敌人,要加以包围歼灭;对垂死挣扎的敌人,如果从后面急追远赶,那是很不利的。 第二十三计:远交近攻 形禁势格,利以近取。害以远隔,上火下泽。 译:处于(扭转)不利的形势(局面),要考虑(阻止)它发展的方向(趋势),(利于)攻取附近的地方,就有利,(不利于)攻击远隔的地方,就有害。《易经聧》卦说:“火苗向上冒,池水向下流,志向不同,也可以结交。” 第二十四计:假途代虢 两大之间,敌胁以从,我假以势,困,有言不信。 译:对处的两个强大敌人中间的国家,敌人胁迫它时,我方却作援求它,立即出兵。《易经困》卦说:“对处在困迫状况下的国家,光空谈而没有行动,是不会被他信任的。” 并战计 第二十五计:偷梁换柱 频更其阵,抽其劲旅,待其自败,而后乘之,曳其轮也。 译:多次变动敌人的阵容,把他的兵力调开,等待他自己败阵,然后用谋进攻他,《易经既济》卦说:“先拖住敌人,然后再替换他。” 第二十六计:指桑骂槐 大凌小者,警以诱之。刚中而应,行险而顺。 译:强大的慑服弱小的,要用警戒的方法来诱导它。《易经师》卦说:适当的强硬,可以得到拥护;施用险诈,可以得到顺从。 第二十七计:假痴不癫 宁伪作不知不为,不伪作假知妄为,静不露机,云雷屯也。 译:宁可假装不知道的,不行动,不可假装知道而轻举妄动。要沉着,不要泄露一点机密,就像迅猛激烈的云雷,在冬季藏入地下般的平静。 第二十八计:上屋抽梯 假之以便,唆之使前,断其援应,陷之死地,遇毒,位不当也。 译:故意露出破绽,引诱敌人深入我方,然后选择有利时机,断绝敌人的前应和后援,使它完全处于死地。敌人这样的下场《易经嗑》上说的好:抢吃腊肉的嗑掉了牙,怪自己的动作不当。 第二十九计:树上开花 借局布势,力小势大;鸿渐于陆,其羽可用为仪也。 译:借别人的局面布成阵势,兵力弱小的看来阵容也显得强大。《易经渐》卦说:鸿雁飞向大陆,全凭它的羽毛丰满助长气势。 第三十计:反客为主 乘隙插足,扼其主机,渐之进也。 译:有空子就要插脚进去,扼住他的主脑机关。《易经渐》卦说:“循序而进”就是这个意思。 败战计 第三十一计:美人计 兵强者,攻其将。将智者,伐其情。将弱兵颓,其势自萎。利用御寇,顺相保也。 译:兵力强大的,就要攻打他的将帅;将帅明智的,就打击他的情绪,用美色诱惑,使其陷入困境或失去战斗力。将帅斗志衰弱、部队士气消沉,他的气势必定自行萎缩。《易经渐》卦说:利用敌人内部的严重弱点来控制敌人,可以有把握地保存自己的实力。 第三十二计:空城计 虚者虚之,疑中生疑;刚柔之际,奇而复奇。 译:空虚的就让它空虚,使人更加难以揣测;在进攻和防御中运用空虚的战术来隐蔽自己的空虚,越发显得用兵出奇。 第三十三计:反间计 疑中之疑,比之向内,不自失也。 译:在疑阵中再布置一层疑阵。《易经比》卦说:来自敌方内部的援助,自己不会受到损失。 第三十四计:苦肉计 人不自害,受害必真。假真真假,间以得行。童蒙之吉,顺以巽也。 译:人不自己迫害自己,受迫害必然是真的;真的变假,间谍便乘机活动。《易经蒙》卦说:把他骗得乖乖的,顺着他活动。 第三十五计:连环计 将多兵众,不可以敌,使其自累,以杀其势。在师中吉,承天宠也。 译:敌方兵力强大,不能硬打,应当运用谋略,使仓储自相牵制,借以削弱他的力量。《易经师》卦说:将帅靠指军不偏不倚,惯打胜仗的就是用兵如神。 第三十六计:走为上计 走为上计全师避敌,在次无咎,未失常也。 译:全军退却,甩开敌人,以退为进,待机破败,这是不违背正常的法则的。 自创计 第三十七计 潜龙勿用 译:自行体悟
-
PHPY 打破语言界限,使PHP引入Python生态,开创PHP语言AI编程时代! PHPY是什么? phpy 是识沃团队最新推出的开源项目,目标是为 PHP 引入 Python 生态,来弥补 PHP 生态的空缺和不足。phpy 使得 PHP 可以调用所有 Python 的包。包括当下非常流行的 AI 库,如:PyTorch、transformers、TensorFlow 等包括当下非常流行的 AI 库,如 PyTorch、transformers、TensorFlow 等,以及科学计算库,如 Numpy、Pandas、Scikit 等,还可以使用图形界面库,如 PyQt、wxPython 等。 不建议在 php-fpm/apache 短生命周期运行环境下使用,频繁地导入/销毁模块的开销会消耗大量资源环境 Linux环境:Ubuntu 22.04.3 LTS PHP版本:PHP 8.1 或以上版本 Python 3.10 或以上版本 安装PHP8.3 下载 wget wget https://www.php.net/distributions/php-8.3.0.tar.gz tar -zxvf php-8.3.0.tar.gz下载地址:https://www.php.net/downloads安装依赖包 sudo apt-get install libfcgi-dev libfcgi0ldbl libjpeg-turbo8-dev libmcrypt-dev libssl-dev libc-client2007e libc-client2007e-dev libxml2-dev libbz2-dev libcurl4-openssl-dev libjpeg-dev libpng-dev libfreetype6-dev libkrb5-dev libpq-dev libxml2-dev libxslt1-dev libzip-dev libsqlite3-dev libonig-dev pkg-config libxml2-dev libkrb5-dev libssl-dev libsqlite3 libbz2-dev libpng-dev libjpg-dev libfreetype6-dev libc-client2007e-dev libonig-dev libreadline-dev libxslt-dev libzip-dev如果安装的依赖包不存在,请通过命令:apt-cache search freetype 查找相应的安装包安装即可编译 ./configure \ --prefix=/usr/local/php-8.3 \ --with-config-file-path=/usr/local/php-8.3/etc \ --with-zlib-dir \ --with-freetype \ --enable-mbstring \ --enable-soap \ --enable-calendar \ --with-curl \ --with-zlib \ --enable-gd \ --disable-rpath \ --enable-inline-optimization \ --with-bz2 \ --with-zlib \ --enable-sockets \ --enable-sysvsem \ --enable-sysvshm \ --enable-pcntl \ --enable-mbregex \ --enable-exif \ --enable-bcmath \ --with-mhash \ --with-zip \ --with-pdo-mysql \ --with-mysqli \ --with-mysql-sock=/var/run/mysqld/mysqld.sock \ --with-jpeg \ --with-openssl \ --with-fpm-user=www \ --with-fpm-group=www \ --with-libdir=/lib/x86_64-linux-gnu \ --enable-ftp \ --with-kerberos \ --with-gettext \ --with-xmlrpc \ --with-xsl \ --enable-opcache \ --enable-intl \ --with-pear \ --enable-fpm编译安装 make make install配置文件 核心 php.ini 配置文件cp php.ini-production /usr/local/php-8.3/etc/php.ini查看PHP版本/usr/local/php-8.3/bin/php -v PHP 8.3.0 (cli) (built: Dec 5 2023 20:03:56) (NTS) Copyright (c) The PHP Group Zend Engine v4.3.0, Copyright (c) Zend Technologies安装Python 安装Anaconda Anaconda 是一个开源的Anaconda是专注于数据分析的Python发行版本,包含了conda、Python等190多个科学包及其依赖项。 Anaconda就是可以便捷获取包且对包能够进行管理,包括了python和很多常见的软件库和一个包管理器conda。常见的科学计算类的库都包含在里面了,使得安装比常规python安装要容易,同时对环境可以统一管理的发行版本。 下载地址:https://www.anaconda.com/download#downloads wget https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh命令行中切换到anaconda文件所在目录 sh Anaconda3-2022.05-Linux-x86_64.sh accept the license terms--yes默认安装路径,/home/用户名/anaconda3=查看Anaconda版本 终端输入 conda --version 或者 conda -V /home/www/anaconda3/condabin/conda --version conda 23.7.4创建虚拟环境 $ conda create -n tinywan-python310 python=3.10 Collecting package metadata (current_repodata.json): done Solving environment: done ==> WARNING: A newer version of conda exists. <== current version: 23.7.4 latest version: 23.11.0 Please update conda by running $ conda update -n base -c defaults conda Or to minimize the number of packages updated during conda update use conda install conda=23.11.0 ## Package Plan ## environment location: /home/www/anaconda3/envs/tinywan-python310 added / updated specs: - python=3.10 The following packages will be downloaded: package | build ---------------------------|----------------- pip-23.3.1 | py310h06a4308_0 2.7 MB python-3.10.13 | h955ad1f_0 26.8 MB setuptools-68.0.0 | py310h06a4308_0 936 KB wheel-0.41.2 | py310h06a4308_0 109 KB ------------------------------------------------------------ Total: 30.5 MB The following NEW packages will be INSTALLED: _libgcc_mutex pkgs/main/linux-64::_libgcc_mutex-0.1-main _openmp_mutex pkgs/main/linux-64::_openmp_mutex-5.1-1_gnu bzip2 pkgs/main/linux-64::bzip2-1.0.8-h7b6447c_0 ca-certificates pkgs/main/linux-64::ca-certificates-2023.08.22-h06a4308_0 ld_impl_linux-64 pkgs/main/linux-64::ld_impl_linux-64-2.38-h1181459_1 libffi pkgs/main/linux-64::libffi-3.4.4-h6a678d5_0 libgcc-ng pkgs/main/linux-64::libgcc-ng-11.2.0-h1234567_1 libgomp pkgs/main/linux-64::libgomp-11.2.0-h1234567_1 libstdcxx-ng pkgs/main/linux-64::libstdcxx-ng-11.2.0-h1234567_1 libuuid pkgs/main/linux-64::libuuid-1.41.5-h5eee18b_0 ncurses pkgs/main/linux-64::ncurses-6.4-h6a678d5_0 openssl pkgs/main/linux-64::openssl-3.0.12-h7f8727e_0 pip pkgs/main/linux-64::pip-23.3.1-py310h06a4308_0 python pkgs/main/linux-64::python-3.10.13-h955ad1f_0 readline pkgs/main/linux-64::readline-8.2-h5eee18b_0 setuptools pkgs/main/linux-64::setuptools-68.0.0-py310h06a4308_0 sqlite pkgs/main/linux-64::sqlite-3.41.2-h5eee18b_0 tk pkgs/main/linux-64::tk-8.6.12-h1ccaba5_0 tzdata pkgs/main/noarch::tzdata-2023c-h04d1e81_0 wheel pkgs/main/linux-64::wheel-0.41.2-py310h06a4308_0 xz pkgs/main/linux-64::xz-5.4.5-h5eee18b_0 zlib pkgs/main/linux-64::zlib-1.2.13-h5eee18b_0 Proceed ([y]/n)? y Downloading and Extracting Packages Preparing transaction: done Verifying transaction: done Executing transaction: done # # To activate this environment, use # # $ conda activate tinywan-python310 # # To deactivate an active environment, use # # $ conda deactivate激活虚拟环境 conda activate tinywan-test查看已有的虚拟环境 $ conda env list # conda environments: # base /home/www/anaconda3 tinywan-test * /home/www/anaconda3/envs/tinywan-test进入虚拟环境查看Python版本 (tinywan-python310) www@xxxxxxx:~/anaconda3$ python --version Python 3.10.13安装phpy 下载 git clone https://github.com/swoole/phpy.git生成 ./configure 配置文件 /usr/local/php-8.3/bin/phpize --with-php-config=/usr/local/php-8.3/bin/php-config指定配置文件 ./configure --with-php-config=/usr/local/php-8.3/bin/php-config --with-python-dir=/home/www/anaconda3/envs/tinywan-python310 --with-python-version=3.10参数说明 --with-php-config PHP配置文件 --with-python-dir Python安装目录 --with-python-version Python版本号(只能使用次版本好,如:3.10.15,则填写3.10) 编译安装 make -j4 sudo make installphp.ini 扩展添加 安装成功后,修改 php.ini ,加入 extension=phpy.so vim /usr/local/php-8.3/etc/php.ini // 添加 extension=phpy.so执行 php -m 检查是否成功加载扩展。 $ php -m |grep phpy phpy使用 案例 os.php <?php function main() { $m = PyCore::import("os"); var_dump($m instanceof PyObject); $rs = $m->uname(); echo $rs; echo $rs->version; } main()查看当前操作系统版本执行结果 /phpy/examples$ /usr/local/php-8.3/bin/php os.php bool(true) posix.uname_result(sysname='Linux', nodename='iZbp1cqx6cq0t2gpl995gqZ', release='4.15.0-137-generic', version='#141-Ubuntu SMP Fri Feb 19 13:46:27 UTC 2021', machine='x86_64')#141-Ubuntu SMP Fri Feb 19 13:46:27 UTC 2021(tinywan-python310)其他 gcc 版本升级 ubuntu18.04的Gcc7.5.0升级到9.4.01、添加Ubuntu的测试工具链 (Toolchain) PPA。这个PPA包含了最新版本的GCC,包括GCC 9: sudo add-apt-repository ppa:ubuntu-toolchain-r/test2、更新你的包列表: sudo apt-get update sudo apt-get upgrade3、查看gcc所有版本 sudo apt-cache search gcc4、安装GCC-9: sudo apt install gcc-95、为了让你的系统默认使用GCC-9,你需要更新你的update-alternatives。首先,安装GCC-9为一个可选项 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90这个命令告诉 update-alternatives 系统 GCC-9 是一个可选项,并给它一个优先级 90 。优先级最高的版本将成为默认版本。如果安装成功会是这样的: gcc -v gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~18.04)
-
Love-Yi情侣网站存在SQL注入漏洞 FOFA介绍 部署在互联网上的网络设备资产信息搜索引擎。旨在尽可能多的对全球IT设备资 产进行信息收集、 漏洞扫描, 进而开展资产影响分析、漏洞影响分析, 为相关流行态势感知分析提供依据。 网址:https://fofa.info/ FOFA图片 漏洞复现 搜索 love-yi 再找到国内站点,访问速度快一点,提高渗透效率 图片 love-yi是一个记录情侣日常的恋爱网站,经某位程序员修改和设计之后,使其更加美观好看,适合哄女朋友开心,或者留作纪念。 图片 找到点点滴滴下的文章 图片 文章详细页面 图片 查看url,包含了一个id 图片 尝试注入,添加一个 ' ?id=6'查看源码,报错,存在SQL注入漏洞 图片 注入payload ?id=6' union select 1,2,3,4 -- qwe还是报错,而且文章内容也没了,说明该表字段不含4列,尝试5列 图片 ?id=6' union select 1,2,3,4,5 -- qwe正常显示,说明该表包含5个字段 图片 这里使用的union联结查询,他通常需要具备三个条件 选择的列数在两个查询中都是相同的。 数据类型在两个查询中都是兼容的。 第一个查询(即原始查询)不返回任何结果,或者你知道如何绕过它(例如,通过使WHERE子句始终为假)。 第三点中提到了原始查询不返回任何结果,得到payload ?id=-6' union select 1,2,3,4,5 -- qwe图片 注入成功,将2修改为如下payload // 拼接数据库版本,当前用户 concat(user(),database())图片 总结 由于作者更喜欢手工注入,因为手工注入更不容易被发现,灵活性,但是技术要求比较高,也比较耗时,使用SQL注入工具可以提高攻击效率和成功率,但也存在易被发现、受安全设备限制、需要特定环境、可能引发误报以及依赖工具更新等缺点。