”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 我如何使用 PHP 和 MySQL 解决具有挑战性的后端问题

我如何使用 PHP 和 MySQL 解决具有挑战性的后端问题

发布于2024-07-31
浏览:495

How I Solved a Challenging Backend Problem with PHP & MySQL

大家好,好久没写博文了;好吧,我在这里写的是我遇到的最具挑战性的问题之一,以及我如何解决它的概述。

作为后端开发人员,挑战尤其是那些会让您兴奋的挑战是无法逃避的。最近,在使用 PHP 和 MySQL 开发广告网络时,我遇到了一个与基于特定标准为发布商优化每千次成本 (CPM) 相关的复杂问题。这个问题考验了我的技术能力,并提供了宝贵的学习经验。在这篇文章中,我将向您介绍我如何逐步解决这个问题,重点介绍所面临的挑战和实施的解决方案。如果我能得到有关如何有效实施或更好的方法的建议,我将很高兴。

问题

任务是根据以下标准调整发布商的每千次展示费用:

  1. 如果过去 10 分钟内有来自 10 个不同 IP 地址的点击,则增加 5%。
  2. 如果过去 10 分钟内同一 IP 地址有 5 次点击,则减少 8%。
  3. 如果来自同一国家/地区连续 10 次点击,则增加 2%。

解决方案之旅

第 1 步:了解要求

在开始实施之前,我需要清楚地了解需求。我与利益相关者进行了讨论,以确认调整 CPM 的标准和期望的行为。这第一步对于有效规划解决方案至关重要。

第 2 步:设置数据库

我已经创建了数据库和表,而且该项目已经上线,所以我只需要添加标准。我确保数据库和表已设置为存储和容纳点击跟踪所需的信息。表架构包含用于存储点击时间戳、IP 地址和国家/地区代码的字段(还有其他字段/列,我不会包含这些字段/列,因为它们对于本文的原因并不重要)。

第 3 步:捕获点击数据

接下来,我实现了一个函数,用于在用户点击广告时获取并保存 IP 地址和国家/地区代码。该数据存储在点击表中。

第 4 步:实施标准检查

捕获数据后,下一步是实施逻辑来检查标准并相应地调整 CPM。

  1. 检查唯一的 IP 地址 我使用 COUNT 函数和 DISTINCT 关键字计算过去 10 分钟内的唯一 IP 地址,该关键字计算组中每一行的表达式并返回唯一非空值的数量。
/** 
 * Get the count of unique IP addresses in the last 10 minutes
 */
$stmt = $pdo->prepare("
    SELECT COUNT(DISTINCT ip_address) AS unique_ips
    FROM clicks
    WHERE date_time >= NOW() - INTERVAL 10 MINUTE
");
$stmt->execute();
$unique_ips = $stmt->fetchColumn();

if ($unique_ips >= 10) {
    $cpm *= 1.05;
} else {
    /**
     * Here, I check for clicks from the same IP address
     * This is in the second condition
     * ...
     **/
}
  1. 检查重复的 IP 地址 然后,我使用 SQL COUNT 函数检查过去 10 分钟内是否有重复或不唯一的 IP 地址。
/** 
 * Checking non-unique (repeated) IP addresses in the last 10 minutes
 * If the condition is true, decrease the CPM by 8%
 */
$stmt = $pdo->prepare("
    SELECT ip_address, COUNT(*) AS click_count
    FROM clicks
    WHERE timestamp >= NOW() - INTERVAL 10 MINUTE
    GROUP BY ip_address
    HAVING click_count >= 5
");
$stmt->execute();
$repeated_ips = $stmt->fetchAll();

if (count($repeated_ips) > 0) {
    $cpm *= 0.92;
} else {
    /**
     * Here, I check for consecutive clicks from the same country
     * This is in the third condition
     * ...
     **/
}
  1. 检查来自同一国家/地区的连续点击 在这里,我应用第三个标准,即检查来自同一国家/地区的连续点击。
/** 
 * Checking clicks from the same country consecutively
 * If the condition is true, increase the CPM by 2%
 */
$stmt = $pdo->prepare("
    SELECT country_code
    FROM clicks
    ORDER BY timestamp DESC
    LIMIT 10
");
$stmt->execute();
$last_ten_clicks = $stmt->fetchAll(PDO::FETCH_COLUMN);

if (count(array_unique($last_ten_clicks)) === 1) {
    $cpm *= 1.02;
}

第 5 步:更新每千次展示费用

对于这一部分,我更新发布商的 CPM 并用它来计算他针对该特定点击的收入。

结果

通过实施此解决方案,广告网络现在可以根据用户的点击数据动态调整 CPM。这确保了发布商的公平和优化的收入模式,提高了广告网络的整体效率。

关于我以及为什么选择 HNG 实习?

我是 Kingsley Gbutemu Kefas,一位热衷于构建可扩展且高效系统的后端开发人员。我是一个问题解决者,我喜欢学习新事物和做事的方法。作为一名开发人员,我的动力来自解决挑战,尤其是那些让我批判性思考的复杂挑战。我知道 HNG 实习对我来说是一个通过从事实际项目并向行业专家学习来成长为开发人员的机会。我很高兴能够开始 HNG 实习之旅并为技术社区做出贡献。我相信这次旅程将提高我的技能并为有影响力的项目做出贡献,并且我相信我将从 HNG Premium 的好处中受益更多。

版本声明 本文转载于:https://dev.to/cyberking99/solving-a-challenging-backend-problem-with-php-h0l?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-05-05
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-05-05
  • 如何从2D数组中提取元素?使用另一数组的索引
    如何从2D数组中提取元素?使用另一数组的索引
    Using NumPy Array as Indices for the 2nd Dimension of Another ArrayTo extract specific elements from a 2D array based on indices provided by a second ...
    编程 发布于2025-05-05
  • 我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    我可以将加密从McRypt迁移到OpenSSL,并使用OpenSSL迁移MCRYPT加密数据?
    将我的加密库从mcrypt升级到openssl 问题:是否可以将我的加密库从McRypt升级到OpenSSL?如果是这样,如何?答案:是的,可以将您的Encryption库从McRypt升级到OpenSSL。可以使用openssl。附加说明: [openssl_decrypt()函数要求iv参...
    编程 发布于2025-05-05
  • 如何使用Python理解有效地创建字典?
    如何使用Python理解有效地创建字典?
    在python中,词典综合提供了一种生成新词典的简洁方法。尽管它们与列表综合相似,但存在一些显着差异。与问题所暗示的不同,您无法为钥匙创建字典理解。您必须明确指定键和值。 For example:d = {n: n**2 for n in range(5)}This creates a dicti...
    编程 发布于2025-05-05
  • 如何使用Regex在PHP中有效地提取括号内的文本
    如何使用Regex在PHP中有效地提取括号内的文本
    php:在括号内提取文本在处理括号内的文本时,找到最有效的解决方案是必不可少的。一种方法是利用PHP的字符串操作函数,如下所示: 作为替代 $ text ='忽略除此之外的一切(text)'; preg_match('#((。 &&& [Regex使用模式来搜索特...
    编程 发布于2025-05-05
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:((-215)!empty()in Function Multultiscale中的“ openCV 要解决此问题,必须确保提供给HAAR CASCADE XML文件的路径有效。在提供的代码片段中,级联分类器装有硬编码路径,这可能对您的系统不准确。相反,OPENCV提...
    编程 发布于2025-05-05
  • 如何同步迭代并从PHP中的两个等级阵列打印值?
    如何同步迭代并从PHP中的两个等级阵列打印值?
    同步的迭代和打印值来自相同大小的两个数组使用两个数组相等大小的selectbox时,一个包含country代码的数组,另一个包含乡村代码,另一个包含其相应名称的数组,可能会因不当提供了exply for for for the uncore for the forsion for for ytry...
    编程 发布于2025-05-05
  • Python不会对超范围子串切片报错的原因
    Python不会对超范围子串切片报错的原因
    在python中用索引切片范围:二重性和空序列索引单个元素不同,该元素会引起错误,切片在序列的边界之外没有。这种行为源于索引和切片之间的基本差异。索引一个序列,例如“示例” [3],返回一个项目。但是,切片序列(例如“示例” [3:4])返回项目的子序列。索引不存在的元素时,例如“示例” [9] ...
    编程 发布于2025-05-05
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-05-05
  • Go语言如何动态发现导出包类型?
    Go语言如何动态发现导出包类型?
    与反射软件包中的有限类型的发现能力相反,本文探索了替代方法,探索了在Runruntime。go import( “ FMT” “去/进口商” ) func main(){ pkg,err:= incorter.default()。导入(“ time”) 如果err...
    编程 发布于2025-05-05
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-05-05
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-05-05
  • Java中如何使用观察者模式实现自定义事件?
    Java中如何使用观察者模式实现自定义事件?
    在Java 中创建自定义事件的自定义事件在许多编程场景中都是无关紧要的,使组件能够基于特定的触发器相互通信。本文旨在解决以下内容:问题语句我们如何在Java中实现自定义事件以促进基于特定事件的对象之间的交互,定义了管理订阅者的类界面。以下代码片段演示了如何使用观察者模式创建自定义事件: args)...
    编程 发布于2025-05-05
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-05-05

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3