公司現(xiàn)有推廣站100+(持續(xù)增加中),每個站后臺都有文章功能,每次發(fā)文章會打包幾千個txt上傳然后解壓讀每個txt把內(nèi)容存進數(shù)據(jù)庫。
現(xiàn)在運營覺得每個站都要登上去操作不方便,想有一個總后臺能對每個站發(fā)文章。
我想的是做成定時任務,先把推廣站的數(shù)據(jù)庫信息都存起來,在發(fā)布平臺選站點并傳文章,循環(huán)拿到站點數(shù)據(jù)庫信息連接上后把文章內(nèi)容寫進去,功能感覺很簡單,這樣循環(huán)連接數(shù)據(jù)庫有坑嗎
7月7號:
功能現(xiàn)在全部做完了,由于測試時只循環(huán)測了3個庫且連接正常就以為上線也行。
上線后站很多一下加了70多個站,但數(shù)據(jù)庫其實只有2個只是庫名不一樣,運營一次性要對20個站上傳文章,且是同一個庫,我這就要循環(huán)20次檢測連接代碼是這樣的
public static function testConnection(SiteInfo $site): bool
{
$connection = null;
try {
$pdo = new PDO(
"mysql:host={$site->db_host};port={$site->port}",
$site->db_username,
$site->db_password,
[
PDO::ATTR_PERSISTENT => false, // 禁用持久連接
// 添加TCP keepalive選項
PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => false,
PDO::ATTR_TIMEOUT => 2,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
);
$connection = new MySqlConnection($pdo);
// $connection->select('SELECT 1');
return true;
} catch (\Exception $e) {
Log::channel('conn')->error($e->getMessage());
return false;
} finally {
// 釋放連接資源
if ($connection instanceof Connection) {
$connection->disconnect();
}
}
}
我的理解是即使是循環(huán)也是連上了就釋放,下一個繼續(xù),不存在占用連接數(shù),但實際上在循環(huán)大概10多次后就報Connection timed out,難道釋放連接不是馬上的?
如果只是針對發(fā)文章不想切換站點重復登錄這個問題,你不如搞一個 webview
套殼的客戶端,在服務端開個專用 API
,授權驗證用專門的 ApiKey
和 AppSecret
,一次配置終生使用,體驗不是更好嗎
你單獨開一個fpm 的程序,主要是把你那些數(shù)據(jù)庫配置集中寫,然后專門寫一個發(fā)布文章的功能,webman 這邊的程序,每次調(diào)用這個fpm 的程序,用來循環(huán)數(shù)據(jù)庫插入
或者,你把數(shù)據(jù)庫配置什么寫到webman 這邊數(shù)據(jù)庫里,然后每個數(shù)據(jù)庫信息對應標識,然后每次去調(diào)用fpm 的時候 把數(shù)據(jù)信息傳遞獲取,那邊根據(jù)你傳遞的數(shù)據(jù)庫信息進行連接
/**
* 動態(tài)連接數(shù)據(jù)庫--備份
* @param string $name 數(shù)據(jù)庫連接名字
* @param array $newDbConfig 需要連接的新數(shù)據(jù)庫配置
*/
function baseDb($name, $newDbConfig)
{
try {
$con = Db::connect($name);
} catch (InvalidArgumentException $e) {
$config = Db::getConfig();
$config['connections'][$name] = $newDbConfig;
Db::setConfig($config);
$con = Db::connect($name);
}
return $con;
}
你吧數(shù)據(jù)庫配置信息都存儲到數(shù)據(jù)庫一個表里面,調(diào)用這個方法執(zhí)行就可以了