表格提交后,我正在从网站上抓取一些内容.问题是脚本时不时地失败,比如说5个脚本失败了2次.我正在使用php curl,COOKIEFILE和COOKIEJAR来处理cookie.但是,当我观察我的浏览器发送的标题(从我的浏览器访问目标网站并使用实时http标头)和php发送的标题时,看到有很多不同之处.
我的浏览器发送了比php curl更多的cookie变量.我认为这种差异可能是因为javascript可用于设置大多数cookie,但我不确定这一点.
我正在使用下面的代码进行抓取,我正在显示我的浏览器和php curl的已发送标题:
$ckfile = tempnam ("/tmp", 'cookiename');
$url = 'https://www.domain.com/firststep';
$poststring = 'variable1=4&variable2=5';
$ch = curl_init ($url);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $poststring);
$output = curl_exec ($ch);
curl_close($ch);
$url = 'https://www.domain.com/nextstep';
$poststring = 'variableB1=4&variableB2=5';
$ch = curl_init ($url);
curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $ckfile);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, …Run Code Online (Sandbox Code Playgroud) 一个大的php脚本使用flush将生成的html的一部分发送到浏览器,同时执行脚本的大部分需要appr.20秒
刷新后执行的脚本部分非常大,从服务器预留(90%cpu)中占用很多.
一旦进入5次页面保持空白(白色),这意味着刷新没有到达发送显示页面正在加载的图像.当程序完成时,页面保持空白(浏览器指示它仍在加载)并且应该将整个页面发送到浏览器.
值得注意的是:当我按下后退按钮时,整个页面将显示(应该在整个脚本执行后应该在浏览器中加载)一秒钟,然后浏览器返回上一页.
所有其他4次页面加载良好.所有5次PHP脚本的输入都是相同的.
我在.htacces文件中有这些设置:
addhandler x-httpd-php5-cgi .php5
addhandler x-httpd-php5-cgi .php5
addhandler x-httpd-php5-cgi .php5
Header Set Cache-Control "max-age=0, no-store"
Run Code Online (Sandbox Code Playgroud)
这是将生成的代码刷新到浏览器的语句:
print str_pad('',4096)."\n";
ob_flush();
flush();
Run Code Online (Sandbox Code Playgroud)
什么可能导致这个问题?
我有一个表 A 和一个表 B。我正在从表 A 中选择信息,其中我只需要表 A 中的信息,其中表 B 联接表 A。我在联合列和 WHERE 子句上有索引。
这是选择代码:
SELECT *
FROM tableA
INNER JOIN tableB AS tableB
ON tableB.id = tableA.id
AND tableB.type = 'car'
Run Code Online (Sandbox Code Playgroud)
当我使用解释时,我可以看到 mysql 对表 A 中的所有行使用全表扫描。此外,它正确地使用索引来连接 tableB。
所以Mysql似乎正在做的是扫描talbeA中的所有行以查看是否与tableB匹配。然而,由于我在两个表的 id 上都有索引,所以我不希望进行表扫描。由于我的表有 50.000 行,此查询需要几秒钟的时间(这对于我的应用程序来说确实太长了)。
这是解释:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE tableA ALL tableA.id NULL NULL 49898
1 SIMPLE tableB eq_ref tableB.type tableB.type 4 1 Use WHere
Run Code Online (Sandbox Code Playgroud)
我的问题:如何优化此查询和索引,以便 Mysql 直接从 tableA 中选择与 tableB 匹配的行,而不扫描 talbeA …
我有这种代码的和平,应该将记录插入到mysql数据库中:
$sql = "INSERT INTO connections (column1, column2, column3, column4, column5, column6, column7) VALUES (?, ?, ?, ?, ?, ?, ?)')";
$stmt = $pdo->prepare($sql);
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($pdo->errorInfo());
}
$stmt->execute(array('wer','wer','wer','2','wer','wer','wer'));
Run Code Online (Sandbox Code Playgroud)
我没有收到任何错误,并且记录未显示在表格中.怎么可能出错?
更新:
由于以下答案,这是完整的工作代码:
$sql = "INSERT INTO connections (column1, column2, column3, column4, column5, column6, column7) VALUES (?, ?, ?, ?, ?, ?, ?)";
$stmt = $pdo->prepare($sql);
if (!$stmt) {
echo "\nPDO::errorInfo():\n";
print_r($pdo->errorInfo());
}
$stmt->execute(array('wer','wer','wer','2','wer','wer','wer'));
Run Code Online (Sandbox Code Playgroud) 我有一个包含 500,000 行的 mysql myisam 表。在这张表中,我有不同类型的地点和经纬度坐标的信息。根据用户的不同,我想在距离由纬度和经度定义的点一定距离内选择某种类型的地方。
我有一个空间索引和一个关于纬度、经度、类型的多列索引。如果某个区域内的行数不是太大,那么这些索引就可以很好地工作。
问题是在某些情况下,我需要从某个点(由纬度、经度坐标定义)使用非常大的半径,因为所需类型的地方很少。然而问题是,当我搜索某种类型时,比如“x”,mysql 会搜索大约 20,000 行,因为我的半径很大,比如“200 公里”。然而,在现实世界中,距离某个点 200 公里范围内只有 5 个类型为“x”的地方。
我在某处读到 BTREE 和 SPATIAL 索引不能组合。但是,我想寻求一种解决方案,在该解决方案中,我能够根据纬度、经度和类型的输入非常快速地选择这 5 个地点。
我尝试了以下两种方法:
方法 1 - 空间索引:
SELECT * FROM destinations
WHERE MBRWithin(lat_lng_point, GeomFromText('Polygon((49.8413216059 12.8478000082, 48.0426783941 12.8478000082, 48.0426783941 15.5861999918, 49.8413216059 15.5861999918, 49.8413216059 12.8478000082))'))
AND destinations.type = 'x'
Run Code Online (Sandbox Code Playgroud)
方法 2 - 纬度、经度的多列索引,类型:
SELECT * FROM destinations FORCE INDEX (lat_long_type_main)
WHERE latitude > 49.7786783941 AND latitude < 51.5773216059
AND longitude > 10.0927907742 AND longitude < 12.9312092258
AND type = 'x'
Run Code Online (Sandbox Code Playgroud)
方法 …
我需要从数据库中选择25列,条件为WHERE和ORDER BY.
我尝试为此制作索引,但仅限于16列.我如何组织mysql语句和数据库,以便以最快的方式从PHP中的数据库中选择这25列?
示例表:
列:A,B,C,D,E,F,....
查询:"SELECT A,B,C,D,E,F,... FROM表WHERE X = 5 ORDER BY Z"
更新1:
这是一个大表(很多行),这就是为什么我需要一个索引来加速这个过程.
php ×4
mysql ×3
apache ×1
cookies ×1
curl ×1
geospatial ×1
indexing ×1
inner-join ×1
join ×1
left-join ×1
pdo ×1
performance ×1
setcookie ×1