我对测试脚本有一个奇怪的问题,从昨天开始我很难解决这个问题。
我的php脚本的工作原理如下: 我有一个大约1000个项目的xml文件,每个项目大约有10个字段。 我运行一个读取xml的php脚本,使用mysqli转义每个字段并批量插入mariadb 10.1(目前正逐一进行)。
有趣的是,它插入大约960行没有问题,但是没有插入大约20到30行,这就是问题所在。
当我说它不插入时,我的意思是即使在运行脚本几分钟后,我也会转到phpmyadmin(或命令行)并且根本找不到那些行(通过id或唯一字段查询名称,等)。
如果我打印查询并通过phpmyadmin插入它,那就没问题了。
但是,当我通过php插入它时,它显示它已被插入甚至返回id(没有错误):
printf ("New Record has id %d.\n", $mysqli->insert_id);
所以我抓住了id,转到phpmyadmin并没有那个id(但是自动增量已经增加)。
更有趣的是,如果我在php上通过id查询,它会显示结果......但如果我选择所有行(也在php上),它就不在列表中。
因此,当我按id选择时,行上有行,但是通过命令行或phpmyadmin不存在该ID。
其中一些记录最终会在几分钟内显示出来,但大多数记录甚至在几个小时后仍未在phpmyadmin上显示。
就像我的一些插页正在排队,一些插入并被丢弃,其他插入没有任何问题。
这是我还没有读过的关于php或mariadb 10.1的新功能或错误吗?
我将进一步调试,但这里有一些代码:
# use dom and xpath
$xml = simplexml_load_file($tmp);
if(is_object($xml)) { echo "XML is an object...<br />"; }
foreach ($xml->job as $r) {
if(isset($r->uid)) {
# filter data
$uid = $mysqli->real_escape_string(trim($r->uid));
$date = $mysqli->real_escape_string(date('Y-m-d H:i:s'));
$title = $mysqli->real_escape_string(trim($r->title));
$descr = $mysqli->real_escape_string(trim($r->descr));
$company = $mysqli->real_escape_string(trim($r->company));
$loc = $mysqli->real_escape_string(trim($r->loc));
$contact = $mysqli->real_escape_string(trim($r->contact));
$jobs[$uid] = "('$uid', '$date', '$title', '$descr', '$company', '$loc', '$contact')";
echo "<br />Found item: $uid / <b>$title</b>";
}
}
# insert in chunks of 10 (also tried REPLACE INTO with same results)
if(count($jobs) > '0') {
echo '<br />Inserting data...<br />';
$chunks = array_chunk($jobs, 10); foreach ($chunks as $chunk) { $insert = implode(", ", $chunk);
$result = $mysqli->query("INSERT INTO core_jobs_tmp (uid, date, title, descr, company, loc, contact) VALUES $insert");
$nid = $mysqli->insert_id;
printf ("New Record has id %d.\n", $mysqli->insert_id);
# check if it's there (debug: usually it's returns the result correctly)
$sql = $mysqli->query("SELECT * FROM core_jobs_tmp WHERE id = '$nid'");
if (mysqli_num_rows($sql) > '0') { while($r = mysqli_fetch_array($sql)) { echo '<br />'.$r['title'].'<br />'; } }
}
}
示例xml,包含2个不能从php插入的项目:
<?xml version='1.0' encoding='UTF-8'?>
<ads>
<job>
<url><![CDATA[someurlhere]]></url>
<uid><![CDATA[42f4505cdb6c637777e7cdfd2ab9f354]]></uid>
<company><![CDATA[Empregos Work]]></company>
<site><![CDATA[indeed.com.br]]></site>
<country><![CDATA[br]]></country>
<date><![CDATA[2016-01-30]]></date>
<loc><![CDATA[Rio de Janeiro, RJ]]></loc>
<title><![CDATA[Assistente Administrativo Júnior]]></title>
<descr><![CDATA[Empresa:
Apenas usuários logados
Cargo:
Assistente Administrativo Júnior
Nível do cargo:
Nível Operacional
Contrato:
Temporário
Sexo:
Indiferente
Quantidade:
Salário:
R$ 970,00
Cidade:
RIO DE JANEIRO
Local de Trabalho:
não disponível
Benefícios:
Vale transporte
Requer Experiencia em:
Experiência anterior na área administrava e atendimento ao cliente
Formação Academica:
Ensino Médio Completo
Competências /
Características Pessoais: OBS: Oportunidade Temporária 3 meses
Atividades:
Atendimento ao cliente, conferência de documentos e lançamento de dados no sistema próprio da empresa.
Disponibilidade para viagens:
É necessário ter carro próprio:]]></descr>
<contact><![CDATA[someurlhere]]></contact>
</job>
<job>
<url><![CDATA[someurlhere]]></url>
<uid><![CDATA[02b5af5d2cc279890aae6f12db7003df]]></uid>
<company><![CDATA[Empregos Work]]></company>
<site><![CDATA[indeed.com.br]]></site>
<country><![CDATA[br]]></country>
<date><![CDATA[2016-01-30]]></date>
<loc><![CDATA[Rio de Janeiro, RJ]]></loc>
<title><![CDATA[Assistente Comercial]]></title>
<descr><![CDATA[Empresa:
Apenas usuários logados
Cargo:
Assistente Comercial
Nível do cargo:
Nível Operacional
Contrato:
Efetivo
Sexo:
Indiferente
Quantidade:
Salário:
R$ 2.300,00
Cidade:
RIO DE JANEIRO
Local de Trabalho:
não disponível
Benefícios:
Vale transporte, vale refeição, plano de saúde e odontológico.
Requer Experiencia em:
Experiência anterior na função.
Formação Academica:
Possuir ensino superior completo ou em andamento
Atividades:
Venda interna e externa de serviços.
Disponibilidade para viagens:
É necessário ter carro próprio:]]></descr>
<contact><![CDATA[someurlhere]]></contact>
</job>
</ads>
表格结构:
CREATE TABLE IF NOT EXISTS `core_jobs_tmp` (
`id` int(11) NOT NULL,
`uid` varchar(64) NOT NULL,
`date` datetime NOT NULL,
`title` varchar(128) NOT NULL DEFAULT '',
`descr` mediumtext NOT NULL,
`company` varchar(128) NOT NULL,
`loc` varchar(128) NOT NULL,
`state` varchar(128) NOT NULL,
`city` varchar(128) NOT NULL,
`contact` varchar(255) NOT NULL,
`paid` int(2) unsigned NOT NULL DEFAULT '0'
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
ALTER TABLE `core_jobs_tmp`
ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `uid` (`uid`), ADD KEY `date` (`date`), ADD KEY `paid` (`paid`), ADD FULLTEXT KEY `title` (`title`,`descr`,`company`,`loc`);
ALTER TABLE `core_jobs_tmp`
MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1;
我的mariadb配置:
[mysql]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld]
user = mysql
default-storage-engine = InnoDB
socket = /var/run/mysqld/mysqld.sock
pid-file = /var/run/mysqld/mysqld.pid
bind-address = 127.0.0.1
character-set-server = utf8
collation-server = utf8_general_ci
# MyISAM #
key-buffer-size = 8M
myisam-recover-options = FORCE,BACKUP
# SAFETY #
max-allowed-packet = 32M
max-connect-errors = 1000000000
explicit_defaults_for_timestamp = 1
# DATA STORAGE #
basedir = /usr
tmpdir = /tmp
datadir = /var/lib/mysql/
# BINARY LOGGING #
log-bin = /var/lib/mysql/mysql-bin
expire-logs-days = 7
sync-binlog = 1
# CACHES AND LIMITS #
tmp-table-size = 128M
max-heap-table-size = 128M
query-cache-type = 0
query-cache-size = 0
max-connections = 1024
thread-cache-size = 1024
wait_timeout = 3600
open-files-limit = 65535
table-definition-cache = 4096
table-open-cache = 4096
# INNODB #
innodb_thread_concurrency = 0
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 384M
innodb-flush-log-at-trx-commit = 0
innodb-file-per-table = 1
innodb-buffer-pool-size = 1800M
# LOGGING #
log-error = /var/log/mysql/mysql-error.log
long_query_time = 2
log-queries-not-using-indexes = 0
slow-query-log = 1
slow-query-log-file = /var/log/mysql/mysql-slow.log
# Fine Tuning #
thread_stack = 256K
ft_min_word_len = 3
[mysqldump]
quick
quote-names
max_allowed_packet = 512M
一些服务器信息:
Server version: 10.1.10-MariaDB-1~jessie-log - mariadb.org binary distribution
Server charset: UTF-8 Unicode (utf8)
Database client version: libmysql - 5.6.24
PHP extension: mysqli
phpMyAdmin Version information: 4.2.12deb2+deb8u1
php -v PHP 5.6.14-0+deb8u1 (cli) (built: Oct 4 2015 16:13:10)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
答案 0 :(得分:0)
实际上,我解决了它。 数据库或安装以某种方式损坏。 我mysqldump数据库到mariadb 10.0上的另一个数据库服务器,它正在工作。 所以我清除并重新安装mariadb 10.1和mysqldump它从mariadb 10回到mariadb 10.1并且它现在正在工作。奇怪的问题,但它奏效了。